我有例外
已检测到关系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,一个包含MyEntity,另一个包含Detail,这是另一个实体。
在有问题的情况下,MyEntity是新的有一个新的细节。我期待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);
}
答案 0 :(得分:42)
问题在于:
MyEntity的ID为0,因为它是一个新的MyEntity。 该集团也是新的,包含对MyEntity的引用。
因此,MyEntity
包含一个Group列表,其中包含一个返回MyEntity
的引用。
问题是MyEntity.Group.MyEntity
似乎是&#34;新的并且不一样&#34;为MyEntity
。将MyEntity添加到上下文时,发现了冲突。
要解决此问题,我将Group.MyEntity
设置为NULL,并将组的引用保留在MyEntity
列表中。保存时,MyEntity
引用(ID)将设置到组表中。
我不确定这是最干净的方法,但问题终于解决了。
答案 1 :(得分:1)
其他一些解决方案可能是我们需要配置双向绑定数据,因为MyEntity需要Group和Group具有MyEntity。您可以参考此链接来配置双向绑定。希望能帮助到你。 EF 5.0 Code First Two way navigation withought foreign key id in child
答案 2 :(得分:0)
问题也可能是您正在创建一个新的子列表,并且您正在将该列表分配给父列表的多个项目,解决方案是您应该为每个父项创建一个新的子列表。