已检测到关系y的角色x的冲突变化

Pat*_*ins 34 c# asp.net-mvc entity-framework ef-code-first entity-framework-4.1

我有例外

已检测到关系y的角色x的冲突变化.

每次我将我的实体添加到我的上下文中

Database.MyEntitys.Add(MyEntity);
Run Code Online (Sandbox Code Playgroud)

MyEntity类包含此属性:

public virtual ICollection<DetailInfo> Group { get; set; }
Run Code Online (Sandbox Code Playgroud)

DetailInfo类非常简单:

public class DetailInfo:BaseEntity {
    public virtual Detail Detail { get; set; }
    public decimal Total { get; set; }
    public virtual MyEntity MyEntity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

在数据库端,表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);
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*ins 44

问题是这个问题:

MyEntity的ID为0,因为它是一个新的MyEntity.该集团也是新的,包含对MyEntity的引用.

因此,MyEntity包含一个包含引用的Group列表MyEntity.

问题是,MyEntity.Group.MyEntity似乎是"新的,不一样的" MyEntity.将MyEntity添加到上下文时,发现了冲突.

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

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

  • 对我不起作用,因为当我尝试将其设置为null时,Group.MyEntity会抛出错误. (3认同)