Это сообщение об ошибке вводит в заблуждение.Вы успешно включили IDENTITY_INSERT, но EF все еще генерирует инструкцию INSERT, предполагая, что значение ключа будет сгенерировано столбцом IDENTITY.
Таким образом, вы дополнительно должны сгенерировать оператор INSERT, содержащий значение ключа.Вы, конечно, можете использовать .ExecuteSqlCommand (), чтобы выполнить INSERT.Или вы можете заставить EF сделать это, но вы должны использовать модель, в которой у этого Entity нет ключей, сгенерированных базой данных.OnModelCreating настраивает модель только один раз для ModelType, поэтому вы не можете просто вставить туда переключатель.
Вместо этого вы можете создать подтип вашего DbContext для заполнения, переопределяя конфигурацию сущности базового DbContext.Например:
class Db_Seed: Db
{
public Db_Seed(string constr) : base(constr)
{
Database.SetInitializer<Db_Seed>(null); //no initializer
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Customer>().Property(c => c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
}
Вы все еще должны включить IDENTITY_INSERT (поскольку таблица имеет IDENTITY), но в этом контексте EF не будет генерировать инструкцию INSERT, предполагающую, что сервер будетсгенерировать ключ.