I am having the exception
Conflicting changes to the role x of the relationship y have been detected.
Every time I add my entity to my context
Database.MyEntitys.Add(MyEntity);
The class MyEntity contain this property :
public virtual ICollection<DetailInfo> Group { get; set; }
The DetailInfo class is pretty simple:
public class DetailInfo:BaseEntity { public virtual Detail Detail { get; set; } public decimal Total { get; set; } public virtual MyEntity MyEntity { get; set; } }
The DatabaseContext is also simple:
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"); } }
On the Database side the table MyEntity has a primary key to the column ID. The DetailInfo has also a primary key called ID. DetailInfo contains 2 FK, one to MyEntity and one to Detail which is another entity.
In the problematic scenario, the MyEntity is new has a new Detail. I am expecting a new entry for MyEntity with a new Detail and having all FK correctly setup.
here is the Insert:
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); }
The problem is this one:
MyEntity has an ID of 0 since it's a new MyEntity. The Group is also new and contain a reference to MyEntity.
So, MyEntity
contains a list of Group which contain a reference back to MyEntity
.
The problem is that MyEntity.Group.MyEntity
seems to be "new and not the same" as MyEntity
. When adding MyEntity to the context, it found a conflict.
To solve the problem I set Group.MyEntity
to NULL and keep the reference of Group inside the list of MyEntity
. When saving, MyEntity
reference (ID) is set into the Group table.
I am not sure it's the cleanest way to do it, but the problem is finally solved.
Some other solution might be we need to configure 2 way binding data because MyEntity need Group and Group has MyEntity. You can refer to this link to configure two way binding. Hope it helps. EF 5.0 Code First Two way navigation withought foreign key id in child
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With