0
Моя корзина
Каталог
0
Моя корзина
Server360 / Разработка / Надо ли вручную заполнять Id при использовании BulkInsertOrUpdate в EFCore.BulkExtensions?

Надо ли вручную заполнять Id при использовании BulkInsertOrUpdate в EFCore.BulkExtensions?

Если поле Id является автоинкрементным в базе данных (IDENTITY(1,1) в SQL Server), то при использовании BulkInsertOrUpdate в EFCore.BulkExtensions его НЕ нужно заполнять вручную.


Что происходит с Id при BulkInsertOrUpdate?

  1. Если Id уже заполнен в сущности → EF Core попробует выполнить UPDATE.
  2. Если Id равен 0 (для int) или Guid.Empty (для Guid) → EF Core попытается выполнить INSERT, но если Id автоинкрементный, это может вызвать ошибки.
  3. Если Id автоинкрементный в БД и вы его не задаёте → SQL Server сам сгенерирует Id при вставке.

Как правильно использовать BulkInsertOrUpdate?

1. Если Idint (автоинкремент)

❌ Ошибочный вариант (не надо присваивать 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. Если IdGuid (не автоинкрементный)

Если 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 сделает это сам.
  • Если IdGuid и не автоинкрементный, его нужно устанавливать вручную.
  • Настройки BulkConfig помогают контролировать поведение

«
»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Компьютеры и комплектующие для бизнеса