Я наткнулся на странную ошибку в моем коде. Это работало раньше, но теперь работает иногда.Прикрепление объекта типа «X» не удалось, поскольку другой объект того же типа
Я использую EF6 для редактирования объекта с некоторыми отношениями. Чтобы не изменять отношения, я их прикрепляю (см. Пример кода).
public void EditA(A ThisIsA, B ThisIsB)
{
using (var Context = new LDZ_DEVEntities())
{
Context.As.Attach(ThisIsA);
var b = Context.Bs.FirstOrDefault(x => x.BId == ThisIsB.BId);
//var b = Context.Bs.Find(ThisIsB.BId);
if (b != null)
Context.Bs.Attach(b);
else
b = ThisIsB;
if (b.C != null)
Context.Cs.Attach(b.C);
ThisIsA.Bs.Add(b);
Context.SaveChanges();
}
}
Я отредактировал названия, чтобы это было просто.
Следующая строка
Context.Cs.Attach(b.C);
выдает эту ошибку:
Attaching an entity of type 'C' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
Эта линия была введена потому, что все объекты C статические объекты. Я никогда не хочу, чтобы C был создан. Если я удалю эту строку, каждый раз, когда я добавлю B в A; создается C. Что нежелательно.
Дополнительно:
А имеет список Б
B имеет один C
Этот метод Эдита() вызывается в нескольких местах в моем программном обеспечении. Эта ошибка появляется только при вызове метода в цикле (импорт). Во время работы над первой записью проблем нет. Но я получаю ошибку в записях после первого.
Я прочитал эти вопросы плюс ответы, но они не работали для меня:
Если А имеет список B и B имеет один C, вам нужно всего лишь приложить А. Bs и Cs будет автоматически вставлен ... –
C являются статическими объектами. Я никогда не хочу вставлять их. B нужно только вставить, если B еще не существует. –
Что вы подразумеваете под «статическими сущностями»? В соответствии с вашим кодом есть набор данных объектов C. Как они могут быть «статическими»? – Kryptos