Проблема производительности Entity Framework при частой реализации и удалении модели - PullRequest
0 голосов
/ 17 мая 2011

Я создаю новую System.Data.Objects.ObjectContext (мою EF модель) каждый раз, когда вызывается метод DAL:

Public void DoSomeDataManipulation()
{
    using (MyModel myModel = new MyModel(connectionString))
        myModel.AddRecord(someParametersHere);
}

DoSomeDataManipulation() вызывается часто (также много других методов). Я пробовал static версию myModel, но EF выдает много ошибок параллелизма при высокой нагрузке.

В настоящее время мне любопытно, может ли этот подход привести Large Object Heap или нет, и является ли это наилучшей практикой для вызова отображенных EF методов.

1 Ответ

0 голосов
/ 17 мая 2011

Использование статического контекста - плохая практика - вы обнаружили, что он не работает в параллельном сценарии (поскольку контекст не является потокобезопасным), но также имеет другие проблемы .

Вы должны использовать новый экземпляр контекста для каждой единицы работы.Является ли добавление единой записи единицей работы (бизнес-операция / транзакция)?В таком случае вы используете это правильно.Если ваша единица работы добавляет несколько записей или любой другой более сложный сценарий, когда вы вставляете / обновляете / удаляете несколько сущностей, вы должны использовать один экземпляр контекста для всей операции.

Использование нового контекста для операции не должно вызыватьпроблемы с производительностью.Внутри контекста используется некоторое описание сопоставления, которое в любом случае является общим.Могут возникнуть проблемы с большой кучей, но это не будет иметь никакого значения при использовании статического контекста.

Большая куча может произойти из-за утечек памяти, вызванных чаще всего прокси-серверами POCO (либо отслеживание, либо отложенная загрузка).Если вы загружаете сущность из контекста, а затем удаляете контекст без отсоединения сущности, он все равно будет содержать ссылку на контекст, а контекст будет содержать ссылки на все присоединенные сущности = если на основную сущность все еще ссылаются, ни контекст объекта, ни что-либо, на что он ссылаетсямусор собрал.В то же время отсоединение сущности нарушит все отношения, потому что нет «DetachGraph».Вы можете отсоединить сущности один за другим, и EF нарушит навигационные свойства.Я думаю, что это ошибка в Entity Framework и динамических прокси.

...