Убедитесь, что вы добавляете ту же ссылку на отслеживаемый экземпляр. Этот тип ошибки обычно возникает, когда разработчики предполагают, что два экземпляра с одинаковым идентификатором интерпретируются как указывающие на одну и ту же запись, поэтому EF будет знать, что это одно и то же.
Например: (Ошибка)
var b = new B { Id = bId, A = new A { Id = aId }};
var c = new C { Id = cId, A = new A { Id = aId }};
context.Bs.Add(b);
context.Cs.Add(c);
bA и c .A указывают на 2 отдельных экземпляра записи «A». (тот же идентификатор, но разные экземпляры) EF обнаружит это как две новые записи A и попытается вставить обе.
Предполагая, что «A» в этом случае также является новой записью:
var a = new A { Id = aId };
var b = new B { Id = bId, A = a };
var c = new C { Id = cId, A = a };
context.Bs.Add(b);
context.Cs.Add(c);
Ключевое отличие в этом примере заключается в том, что мы создаем новый единственный экземпляр «A», а затем ссылаемся на него в наших новых B и C. Когда контекст отслеживает это, они будут указывать на один и тот же экземпляр. 1015 * Это гарантирует, что ссылка A, о которой должен знать контекст как существующая запись, загружается и используется в новых ссылках B и C. Если вы создаете новый A даже с использованием уже существующего идентификатора, добавление его в Context прямо или косвенно через новый B или C заставит EF рассматривать его как новую запись и пытаться вставить ее. Это приведет к повторяющимся ошибкам PK или, что еще хуже, к проблемам без вывода сообщений, если идентификаторы настроены как столбцы идентификаторов, поскольку он может вставлять новые записи «A» с новыми идентификаторами, которых вы не ожидаете.