несколько добавленных объектов могут иметь один и тот же первичный ключ для некоторых объектов cycli c - PullRequest
0 голосов
/ 02 августа 2020

У меня есть сущность cycli c, хочу сохранить все детали EntityA, прикрепив объекты навигации, такие как Entity B и Entity C, но при попытке сохранить получение «несколько добавленных сущностей могут иметь один и тот же первичный ключ. ошибка". Идентификаторы во всей таблице идентичны. В основном мне нужна ссылка на A и B в таблице C и ссылка на A в B.`

 

     public class EntityA
    {
        [Key]
        public int QID { get; set; }
    
        public virtual List<EntityC> EntityCs { get; set; }
    
        public virtual List<EntityB> EntityBs { get; set; }
    }
    
    public class EntityB
    {
        [Key]
        public int OptionID { get; set; }
        public int QID { get; set; }
        [ForeignKey("QID")]
        public virtual EntityA EntityA { get; set; }
    }
       
    
     public class EntityC
     {
                [Key]
                public int CID { get; set; }
                public int QID { get; set; }
                public int OptionID { get; set; }
                [ForeignKey("QID")]
                public virtual EntityA EntityA { get; set; }
                [ForeignKey("OptionID")]
                public virtual EntityB Option { get; set; }
      }

1 Ответ

0 голосов
/ 03 августа 2020

Убедитесь, что вы добавляете ту же ссылку на отслеживаемый экземпляр. Этот тип ошибки обычно возникает, когда разработчики предполагают, что два экземпляра с одинаковым идентификатором интерпретируются как указывающие на одну и ту же запись, поэтому 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» с новыми идентификаторами, которых вы не ожидаете.

...