【问题标题】:Conflicting changes to the role x of the relationship y have been detected已检测到关系 y 的角色 x 的冲突更改
【发布时间】:2012-08-10 00:23:44
【问题描述】:

我遇到了异常

已检测到关系 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);
}

【问题讨论】:

  • 您的数据库集在哪里声明?
  • 在继承 DbContext 的 DatabaseContext 类中。
  • 你能显示导致异常的代码吗? (我想知道“MyEntity 有一个新的 Detail”是什么意思,尽管 MyEntity 在您显示的模型中没有 Detail 属性。)
  • 当您的对象图不一致时会发生这种情况 - 例如,实体 A 在导航属性中引用了 B,但 B 上的反向导航属性不包含对 A 的引用。您是否对方式进行了任何更改EF 如何检测变化?
  • 我添加了一些插入完成的代码。 A 和 B 不知道彼此的唯一参考是“PropertyOneToOne”(请参阅​​新代码)。只有 MyEntity 知道它。但是,添加的使一切都失败的新代码仅涉及添加属性“组”这就是为什么我怀疑更多的“组”属性配置是错误的。

标签: c# asp.net-mvc entity-framework entity-framework-4.1 ef-code-first


【解决方案1】:

问题是这个:

MyEntity 的 ID 为 0,因为它是一个新的 MyEntity。 该组也是新的,包含对 MyEntity 的引用。

所以,MyEntity 包含一个 Group 列表,其中包含对 MyEntity 的引用。

问题在于MyEntity.Group.MyEntity 似乎与MyEntity 是“新的,不一样的”。将 MyEntity 添加到上下文时,发现冲突。

为了解决这个问题,我将Group.MyEntity 设置为NULL,并将Group 的引用保留在MyEntity 的列表中。保存时,MyEntity 引用 (ID) 被设置到 Group 表中。

我不确定这是不是最干净的方法,但问题终于解决了。

【讨论】:

  • 对我不起作用,因为当我尝试将 Group.MyEntity 设置为 null 时会引发错误。
  • @patrick-desjardins 我遇到了同样的问题,我按照与您相同的方式解决了它。无论如何,我正在使用 EF 6,我不太相信建议的解决方案仍然是最好的解决方案。碰巧,你听说过一些新的东西吗?
  • 我在附加项目之前将所有引用的字段设置为空,它对我有用。
【解决方案2】:

其他一些解决方案可能是我们需要配置 2 路绑定数据,因为 MyEntity 需要 Group 并且 Group 有 MyEntity。您可以参考此链接来配置双向绑定。希望能帮助到你。 EF 5.0 Code First Two way navigation withought foreign key id in child

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多