Вопрос по c#, asp.net-mvc, entity-framework, ef-code-first, entity-framework-4.1 – Обнаружены конфликтующие изменения роли x отношения y

31

У меня есть исключение

Conflicting changes to the role x of the relationship y have been detected.

Каждый раз, когда я добавляю свою сущность в мой контекст

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 имеет первичный ключ для идентификатора столбца. DetailInfo также имеет первичный ключ с именем ID. DetailInfo содержит 2 FK, один для MyEntity и один для Detail, который является другим объектом.

В проблемном сценарии MyEntity новый имеет новую деталь. Я ожидаю новую запись для MyEntity с новой деталью и правильной настройкой всех FK.

Edit:

вот вставка:

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);
}
Не могли бы вы показать код, который вызывает исключение? (Мне интересно, что это означает, что «MyEntity имеет новую деталь», хотя MyEntity не имеет свойства Detail в модели, которую вы показываете.) Slauma
где объявлены ваши dbsets? Brian
В моем классе DatabaseContext, которые наследуют DbContext. Patrick Desjardins
Я добавил часть кода, где вставка завершена. Единственное упоминание, что A и B не знают друг друга, это "PropertyOneToOne". (см. новый код). Только MyEntity знает об этом. Но добавленный новый код, заставляющий все терпеть неудачу, касается только добавления свойства & quot; Группа & quot; вот почему я подозреваю, что «Группа» более неправильная конфигурация свойства Patrick Desjardins
Это происходит, когда ваш объектный граф не согласован - например, сущность A имеет ссылку на B в свойстве навигации, но свойство обратной навигации на B не содержит ссылку на A. Вносили ли вы какие-либо изменения в способ, которым EF обнаруживает изменения? Ladislav Mrnka

Ваш Ответ

3   ответа
41

MyEntity имеет идентификатор 0, поскольку он является новым MyEntity. Группа также является новой и содержит ссылку на MyEntity.

Так,MyEntity содержит список групп, которые содержат ссылку наMyEntity.

Проблема в том, чтоMyEntity.Group.MyEntity кажется "новым, а не тем же" какMyEntity, При добавлении MyEntity в контекст обнаружен конфликт.

Чтобы решить проблему, которую я поставилGroup.MyEntity NULL и сохранить ссылку группы в спискеMyEntity, При сохранении,MyEntity ссылка (ID) устанавливается в таблице группы.

Я не уверен, что это самый чистый способ сделать это, но проблема наконец решена.

@ patrick-desjardins Я столкнулся с той же проблемой и решил ее так же, как вы. В любом случае, я работаю с EF 6, и я не настолько убежден, что предлагаемое решение по-прежнему является лучшим. Случайно, вы слышали что-то новое об этом?
Не работает для меня, потому что Group.MyEntity выдает ошибку, когда я пытаюсь установить его в ноль.
0

что вы создаете новый дочерний список и назначаете этот список нескольким элементам родительского списка. Решение состоит в том, что вы должны создать новый дочерний список для каждого из родительских элементов.

1

что нам нужно настроить двустороннее связывание данных, поскольку MyEntity нужна группа, а в группе есть MyEntity. Вы можете обратиться к этой ссылке, чтобы настроить двустороннюю привязку. Надеюсь, поможет.EF 5.0 Code First Двусторонняя навигация без идентификатора внешнего ключа у дочернего элемента

Похожие вопросы