Как добавить несколько объектов в одной транзакции с автоматически сгенерированным идентификатором? - PullRequest
0 голосов
/ 06 января 2020

У меня есть это в al oop

theTag = new ReportAdminTag() { Text = tag.Text };
_context.ReportAdminTag.Add(theTag);
_context.Entry(theTag).State = EntityState.Detached;
_context.SaveChanges();

, но второй раз, когда он выдает ошибку

Экземпляр типа сущности 'ReportAdminTag' не может быть отслежен, потому что другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается

Идентификаторы - оба Guid по умолчанию, потому что я использую ms sql newid () для генерации идентификаторов.

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Я перезапустил Scaffold-DbContext, чтобы сгенерировать код из базы данных, и все заработало. Возможно, я внес небольшое изменение, которое не привело к ошибке и вместо этого странному поведению.

Урок здесь - не go в отпуске с незавершенной работой.

0 голосов
/ 07 января 2020

Похоже, что существует проблема в реализации EF, связанная с поставщиком InMemory в EF Core.

Однако это также может произойти (дублирование) на SQL Сервере, связанном со значением результата NewID () или NewSequentialID ( ) function.

Так что, похоже, будет больше безопасности , если вы создадите помощника guid для помощи EF при добавлении новой сущности, содержащей столбец guid.

Я предлагаю объединить значение Guid.NewId () с любым значением Random, чтобы сгенерировать 32 байта в кодировке base85 (varchar (32) *).

*) установить тип столбца guid в varchar (32).

...