检测到对关系y的角色x的冲突更改

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个外键,一个指向MyEntity,另一个指向另一个实体Detail。

在存在问题的情况下,MyEntity是新的并且有一个新的Detail。我期望会有一个新的MyEntity条目,其中包含一个新的Detail,并且所有外键都正确设置。

编辑:

这里是插入操作:

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);
}

你的 dbsets 声明在哪里? - Brian
在我的 DatabaseContext 类中继承了 DbContext。 - Patrick Desjardins
你能展示一下引起异常的代码吗?(我想知道"MyEntity有一个新的Detail"是什么意思,尽管在你展示的模型中MyEntity没有Detail属性。) - Slauma
1
当您的对象图不一致时会发生这种情况 - 例如,实体A在导航属性中引用了B,但是B上的反向导航属性不包含对A的引用。您是否对EF检测更改的方式进行了任何更改? - Ladislav Mrnka
我添加了一些代码,其中包括插入操作。唯一的参考是A和B彼此不认识,这是通过“PropertyOneToOne”(请参见新代码)实现的。只有MyEntity知道它。但是,新添加的代码使一切都失败了,这是因为添加“Group”属性,所以我怀疑“Group”属性配置更可能是错误的。 - Patrick Desjardins
我尝试将 HasRequired(x => x.Detail); 更改为 HasRequired(x => x.Detail).WithRequiredPrincipal();,但没有成功。我认为 WithRequiredPrincipal 应该使导航的一侧工作,但似乎并不是这样。 - Patrick Desjardins
3个回答

50
问题是这样的:
我的实体(MyEntity)是新的,因此它的ID为0。组(Group)也是新的,并包含对MyEntity的引用。
因此,MyEntity包含了一个包含对MyEntity的引用的Group列表。
问题是,MyEntity.Group.MyEntity似乎是“新的且不同于”MyEntity。在将MyEntity添加到上下文时,发现了冲突。
为解决问题,我将Group.MyEntity设置为NULL,并将Group的引用保留在MyEntity的列表中。在保存时,MyEntity的引用(ID)被设置到Group表中。
我不确定这是否是最清晰的方法,但问题终于得到解决。

3
对我来说不起作用,因为当我尝试将Group.MyEntity设置为空时会出现错误。 - argyle
@patrick-desjardins 我遇到了同样的问题,我按照你的方式解决了它。不过我正在使用EF 6,我并不确定建议的解决方案是否仍然是最好的。你有没有听说过关于这个问题的新消息? - Rubens Mussi Cury
在附加项目之前,我将所有引用字段设置为null,这对我起作用了。 - Furkan Ekinci

1

0
问题可能是您正在创建一个新的子列表,并将该列表分配给父列表的多个项目,解决方案是为每个父项创建一个新的子列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接