39

私は例外があります

関係yの役割xへの矛盾する変更が検出されました。

エンティティをコンテキストに追加するたびに

Database.MyEntitys.Add(MyEntity);

クラスMyEntityには、次のプロパティが含まれています。

public virtual ICollection<DetailInfo> Group { get; set; }

DetailInfoクラスは非常に単純です。

public class DetailInfo:BaseEntity {
    public virtual Detail Detail { get; set; }
    public decimal Total { get; set; }
    public virtual MyEntity MyEntity { get; set; }
}

DatabaseContextも単純です。

public class MyEntityConfiguration : EntityTypeConfiguration<MyEntity> {
    public MyEntityConfiguration() {
        HasMany(e => e.Group).WithRequired(s => s.MyEntity).WillCascadeOnDelete(true);
    }
}

public class DetailInfoConfiguration : EntityTypeConfiguration<DetailInfo> {
    public DetailInfoConfiguration() {
        HasRequired(x => x.MyEntity).WithMany(s => s.Group);
        HasRequired(x => x.Detail);
        HasKey(s => s.ID);
        ToTable("DetailInfo");
    }
}

データベース側では、テーブルMyEntityに列IDへの主キーがあります。DetailInfoには、IDと呼ばれる主キーもあります。DetailInfoには2つのFKが含まれています。1つはMyEntityに、もう1つは別のエンティティであるDetailにあります。

問題のあるシナリオでは、MyEntityisnewに新しいDetailがあります。MyEntityの新しいエントリに新しい詳細があり、すべてのFKが正しく設定されていることを期待しています。

編集:

これが挿入です:

public virtual int Insert(MyEntity myEntity) {

    if (myEntity.Group != null && myEntity.Group.Count() == 0) {
        myEntity.Group = null; 
    }

    if (myEntity.Group != null) {
        foreach (var g in myEntity.Group)
        {
         if (g.PropertyOneToOne != null) {
                if (g.PropertyOneToOne.ID == 0) {
                    myEntity.PropertyOneToOne = null;
                }
                else {
                    if (!Database.PropertyOneToOnes.Local.Any(e => e.ID == g.PropertyOneToOne.ID)) {
                        Database.PropertyOneToOnes.Attach(g.PropertyOneToOne);
                    }
                    myEntity.PropertyOneToOne = Database.PropertyOneToOnes.Local.Single(e => e.ID == g.PropertyOneToOne.ID);
                }
            }
            else {
                myEntity.PropertyOneToOne = null;
            }
        }
    }
    Database.MyEntitys.Add(myEntity);
}
4

3 に答える 3

50

問題はこれです:

MyEntityは新しいMyEntityであるため、IDは0です。グループも新しく、MyEntityへの参照が含まれています。

したがって、MyEntityへの参照を含むグループのリストが含まれていますMyEntity

問題は、それMyEntity.Group.MyEntityが「新しく、同じではない」ように見えることMyEntityです。MyEntityをコンテキストに追加すると、競合が見つかりました。

この問題を解決するために、Group.MyEntityNULLに設定し、グループの参照をのリスト内に保持しますMyEntity。保存時に、MyEntity参照(ID)がグループテーブルに設定されます。

それが最もクリーンな方法かどうかはわかりませんが、問題は最終的に解決されました。

于 2012-08-14T13:08:30.823 に答える
1

MyEntityにはGroupが必要であり、GroupにはMyEntityがあるため、他の解決策として、双方向バインディングデータを構成する必要がある場合があります。このリンクを参照して、双方向バインディングを構成できます。それが役に立てば幸い。EF5.0コードファースト双方向ナビゲーションは子の外部キーIDを使用しませんでした

于 2015-06-26T16:33:52.627 に答える
0

問題は、新しい子リストを作成していて、そのリストを親リストの複数のアイテムに割り当てていることでもある可能性があります。解決策は、親アイテムごとに新しい子リストを作成する必要があることです。

于 2017-04-05T07:08:08.887 に答える