Это ваша проблема:
var child = new ChildEntity
{
Foo = "",
Bar = "",
ParentEntityId = id,
WarehouseId = 1,
WarehouseLocationId = 1
};
parent.ChildEntities.Add(child);
ИМХО, это все о коллекциях исправлений, скрытых в коде, сгенерированном шаблоном POCO.Fixup + отложенная загрузка = проблемы с производительностью.Fixup пытается синхронизировать все в вашей модели.Это означает, что если вы установите одну сторону свойства навигации или свойства FK, он попытается убедиться, что свойство навигации на противоположной стороне отношения также отражает изменение.Проблема в том, что если свойство навигации не загружено, оно будет вызывать отложенную загрузку.В вашем случае это выглядит как установка Warehouse сначала исправила свойство навигации в ChildEntity
и после этого пыталась исправить свойство навигации в экземпляре Warehouse
, но его коллекция дочерних объектов не была загружена => отложенная загрузка, вызывающая
SELECT * FROM ChildEntities where WarehouseId = some id
То же самое произошло в случае WarehouseLocation
.Первый запрос является результатом добавления дочернего элемента в незагруженную коллекцию родительской сущности.
Решение состоит в том, чтобы либо изменить шаблон и избавиться от всех исправлений (например, шаблон DbContext POCO для EFv4.1 + не использоватьисправления) или отключите отложенную загрузку для этой операции, вызвав:
context.ContextOptions.LazyLoadingEnabled = false;
// Your insert logic here
context.ContextOptions.LazyLoadingEnalbed = true;
Вы можете даже обернуть код в пользовательский IDisposable, например:
public class DisableLazyLoadingScope : IDisposable
{
private readonly ObjectContext context;
public DisableLazyLoadingScope(ObjectContext context)
{
this.context = context;
context.ContextOptions.LazyLoadingEnabled = false;
}
public void Dispose()
{
context.ContextOptions.LazyLoadingEnabled = true;
}
}
И использовать его следующим образом:
using (new DisableLazyLoadingScope(context)
{
// Your insert logic here
}