В EF Core 3.x вы можете обрабатывать событие ChangeTracker.Tracked и сбрасывать, явно устанавливая автоматически сгенерированный PK для каждого объекта Added
, подобного этому (он не должен находиться снаружи, вы можете самостоятельно присоединить контекст db для этого события):
dbContext.ChangeTracker.Tracked += (sender, e) =>
{
if (!e.FromQuery && e.Entry.State == EntityState.Added && e.Entry.IsKeySet)
{
var pk = e.Entry.Metadata.FindPrimaryKey();
if (pk.Properties.Count == 1)
{
var pkProperty = pk.Properties[0];
if (pkProperty.ValueGenerated == ValueGenerated.OnAdd &&
defaultValues.TryGetValue(pkProperty.ClrType, out var defaultValue))
{
e.Entry.State = EntityState.Detached;
e.Entry.CurrentValues[pkProperty] = defaultValue;
var newEntry = e.Entry.Context.Entry(e.Entry.Entity);
newEntry.State = EntityState.Added;
}
}
}
};
, где defaultValues
- это словарь с помеченными 0
(нулевыми) значениями поддерживаемых типов свойств с автоинкрементом (при необходимости вы можете добавить больше):
static readonly Dictionary<Type, object> defaultValues = new Dictionary<Type, object>
{
{ typeof(int), default(int) },
{ typeof(long), default(long) },
{ typeof(decimal), default(decimal) },
};
Но обратите внимание, что это не исправит отношения, которые используют явные свойства FK без свойства навигации по ссылкам.