Я вставляю несколько экземпляров определенного объекта в базу данных, используя Entity Framework. У меня есть один объектный контекст, к которому я присоединяю несколько объектов «Продукт». Вставляемый мной объект не имеет отношения к какой-либо другой таблице в базе данных. Это чисто отдельная сущность. Я использую инструмент EFProf для профилирования приложения.
Когда я вызываю «SaveChanges ()» для сохранения своих сущностей «Продукт» на SQL Server, EFProf предупреждает меня, что у меня есть антишаблон «Выбрать N + 1». Я не понимаю, как это возможно, потому что я просто вставляю. Мое понимание «Выбрать N + 1» заключается в том, что это относится к неэффективному поиску объектов. Я ничего не получаю, только вставляю.
Когда я проверяю сгенерированный SQL, я вижу, что Entity Framework сгенерировал от моего имени оператор select, который возвращает Id вновь вставленного объекта. Этот оператор выбора выполняется для каждой сущности, которую я вставляю. Может ли это быть причиной проблемы выбора N + 1? Если так, как я могу избежать этого анти-паттерна при вставке нескольких сущностей одного типа в один вызов SaveChanges ()?
Сгенерированный SQL ниже:
insert [dbo].[Products]
([ProductName],
[ProductNum],
[Price],
[EntryDate],
[Description],
[Category],
[UnitsInStock])
values('TestProduct' /* @0 */,
0 /* @1 */,
0 /* @2 */,
'2011-07-09T17:14:49.00' /* @3 */,
'Category: Test Products - Name TestProduct' /* @4 */,
'Test Products' /* @5 */,
0 /* @6 */)
select [Id]
from [dbo].[Products]
where @@ROWCOUNT > 0
and [Id] = scope_identity()