Невозможно отследить объект типа «Сущность», поскольку его свойство первичного ключа «Id» имеет значение null

avatar
Hector
9 августа 2021 в 02:37
153
1
0
public clase Book
{
  [Key]
  public string Id{get;set;}
  public string Name{get;set;}
  ...
}
_dbContext.Books.Add(new Entity(){
   Name="C#10.0",
   ....
})
_dbContext.SaveChanges()

Сообщение об исключении: System.InvalidOperationException: невозможно отследить объект типа «Книга», так как его свойство первичного ключа «Id» имеет значение null.

в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NullableKeyIdentityMap`1.Add(InternalEntityEntry entry) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking (запись InternalEntityEntry) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, логическое значение acceptChanges, логическое значениеmodifyProperties)

When I use this DatabaseGeneratedAttribte, after assigning a value to the primary key in the application, call "SaveChanges()" an exception will be thrown and the trace will be modified.

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

Источник
Hector
9 августа 2021 в 02:46
0

EntityFromeworkCore >= 5.0 и Pomelo.EntityFrameworkCore.MySql >= 5.0

Ivan Stoev
9 августа 2021 в 03:50
0

Не уверен, что понимаю проблему. string свойства не создаются автоматически по умолчанию. Если вы хотите, чтобы он генерировался автоматически, используйте атрибут или свободный API для его настройки. Тогда по идее, если вы укажете значение PK, оно будет использовано, иначе будет сгенерировано автоматически. Итак, с тем, что вы показали, обычно получается такое исключение, поскольку ПК не генерируется автоматически, поэтому вы можете опустить это из вопроса. В чем проблема с использованием атрибута?

Hector
9 августа 2021 в 06:46
0

Вы точно понимаете, что я думаю. Проблема заключается в следующем. данные могли быть изменены или удалены после загрузки сущностей. См. go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистического параллелизма. в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32

Ivan Stoev
9 августа 2021 в 07:08
0

Хм, а у вас есть какая-нибудь гибкая конфигурация, например HasDefaultValueSql для этого свойства? Проблема в том, что автоматическая генерация может быть на стороне клиента или на стороне базы данных. И от этого зависит поведение команды EF INSERT. Нужно посмотреть, что делает Pomelo для автоматически сгенерированных строк - обычно они автоматически генерируются на стороне клиента с новым Guid, преобразованным в строку.

Hector
9 августа 2021 в 08:02
0

Вышеупомянутая ошибка заключается в том, что настроен ValueGeneratedOnAdd. Если конфигурация сможет достичь моей цели, она будет идеальной. Я консультировался в pomelo. Они сказали, что это должно быть efcore. Это ужасно.

Ответы (1)

avatar
Majid Shahabfar
9 августа 2021 в 04:14
0

Если вы хотите, чтобы параметр Id генерировался автоматически, убедитесь, что вы применили ValueGeneratedOnAdd() для этого параметра в методе ModelCreating:

protected override void OnModelCreating(ModelBuilder builder)
{
            builder.Entity<Book>(entity =>
            {
                entity.Property(e => e.Id).ValueGeneratedOnAdd();
            });
}

В противном случае необходимо присвоить идентификатору правильное значение перед добавлением объекта книги в БД.

Hector
9 августа 2021 в 06:51
0

Спасибо за ваш совет, но это не то, что я ожидал. По идее я предоставляю значение PK, тогда оно будет использовано, иначе будет сгенерировано автоматически.