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.
Я ожидаю, что это значение будет преобладать после присвоения значения первичному ключу. Если он не назначен, значение может быть сгенерировано автоматически.
EntityFromeworkCore >= 5.0 и Pomelo.EntityFrameworkCore.MySql >= 5.0
Не уверен, что понимаю проблему.
string
свойства не создаются автоматически по умолчанию. Если вы хотите, чтобы он генерировался автоматически, используйте атрибут или свободный API для его настройки. Тогда по идее, если вы укажете значение PK, оно будет использовано, иначе будет сгенерировано автоматически. Итак, с тем, что вы показали, обычно получается такое исключение, поскольку ПК не генерируется автоматически, поэтому вы можете опустить это из вопроса. В чем проблема с использованием атрибута?Вы точно понимаете, что я думаю. Проблема заключается в следующем. данные могли быть изменены или удалены после загрузки сущностей. См. go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке исключений оптимистического параллелизма. в Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException (Int32 commandIndex, Int32
Хм, а у вас есть какая-нибудь гибкая конфигурация, например
HasDefaultValueSql
для этого свойства? Проблема в том, что автоматическая генерация может быть на стороне клиента или на стороне базы данных. И от этого зависит поведение команды EFINSERT
. Нужно посмотреть, что делает Pomelo для автоматически сгенерированных строк - обычно они автоматически генерируются на стороне клиента с новымGuid
, преобразованным в строку.Вышеупомянутая ошибка заключается в том, что настроен ValueGeneratedOnAdd. Если конфигурация сможет достичь моей цели, она будет идеальной. Я консультировался в pomelo. Они сказали, что это должно быть efcore. Это ужасно.