例外があります
関係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に対応しています。
問題のあるシナリオでは、MyEntity is newに新しい詳細があります。 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);
}
問題はこれです:
MyEntityは新しいMyEntityであるため、IDは0です。グループも新しく、MyEntityへの参照が含まれています。
したがって、MyEntity
には、MyEntity
への参照を含むグループのリストが含まれています。
問題はそれです MyEntity.Group.MyEntity
はMyEntity
と「新しく、同じではない」ようです。 MyEntityをコンテキストに追加すると、競合が見つかりました。
問題を解決するために、私はGroup.MyEntity
をNULLにして、MyEntity
のリスト内にGroupの参照を保持します。保存時に、MyEntity
参照(ID)がグループテーブルに設定されます。
それが最もクリーンな方法かどうかはわかりませんが、問題はようやく解決されました。
MyEntityにはグループが必要であり、グループにはMyEntityがあるため、他のいくつかの解決策として、双方向のバインディングデータを構成する必要があります。このリンクを参照して、双方向バインディングを構成できます。それが役に立てば幸い。 EF 5.0コードの最初の双方向ナビゲーションで子の外部キーIDを求めた
問題は、新しい子リストを作成していて、そのリストを親リストの複数のアイテムに割り当てることでもあります。解決策は、親アイテムごとに新しい子リストを作成する必要があることです。