Если поле Id
является автоинкрементным в базе данных (IDENTITY(1,1)
в SQL Server), то при использовании BulkInsertOrUpdate
в EFCore.BulkExtensions
его НЕ нужно заполнять вручную.
Что происходит с Id
при BulkInsertOrUpdate
?
- Если
Id
уже заполнен в сущности → EF Core попробует выполнить UPDATE. - Если
Id
равен0
(дляint
) илиGuid.Empty
(дляGuid
) → EF Core попытается выполнить INSERT, но еслиId
автоинкрементный, это может вызвать ошибки. - Если
Id
автоинкрементный в БД и вы его не задаёте → SQL Server сам сгенерируетId
при вставке.
Как правильно использовать BulkInsertOrUpdate
?
1. Если Id
— int
(автоинкремент)
❌ Ошибочный вариант (не надо присваивать Id
)
csharpКопироватьРедактироватьvar entities = new List<MyEntity>
{
new MyEntity { Id = 0, Name = "Test1" }, // Ошибка, т.к. ID автоинкрементный
new MyEntity { Id = 0, Name = "Test2" }
};
dbContext.BulkInsertOrUpdate(entities);
✅ Правильный вариант (не заполняем Id
)
csharpКопироватьРедактироватьvar entities = new List<MyEntity>
{
new MyEntity { Name = "Test1" },
new MyEntity { Name = "Test2" }
};
dbContext.BulkInsertOrUpdate(entities);
🔹 В этом случае SQL Server сам назначит Id
при вставке.
2. Если Id
— Guid
(не автоинкрементный)
Если Guid
является Primary Key, но не автоинкрементный, то Id
нужно присваивать вручную:
csharpКопироватьРедактироватьvar entities = new List<MyEntity>
{
new MyEntity { Id = Guid.NewGuid(), Name = "Test1" },
new MyEntity { Id = Guid.NewGuid(), Name = "Test2" }
};
dbContext.BulkInsertOrUpdate(entities);
🔹 В отличие от int
, SQL Server не создаёт Guid
автоматически, если не используется NEWSEQUENTIALID()
.
Дополнительные настройки
Если Id
автоинкрементный, можно явно указать, что его не надо вставлять:
csharpКопироватьРедактироватьvar bulkConfig = new BulkConfig { SetOutputIdentity = true };
dbContext.BulkInsertOrUpdate(entities, bulkConfig);
🔹 SetOutputIdentity = true
→ после INSERT
обновит Id
в сущностях.
Вывод
- Если
Id
автоинкрементный (IDENTITY
), его не надо заполнять, SQL Server сделает это сам. - Если
Id
—Guid
и не автоинкрементный, его нужно устанавливать вручную. - Настройки
BulkConfig
помогают контролировать поведение
Добавить комментарий