Создание DataContext в каком слое?
Я создаю новое приложение Silverlight, используя RIA. Я использую бизнес-уровень и уровень доступа к данным, это выглядит примерно так...
Silverlight-> ASP.Net/RIA-> Библиотека классов C# BLL-> Библиотека классов C# DAL Моя модель инфраструктуры сущностей доступна на всех уровнях.
Я не уверен, где создать DataContext для моих запросов Entity Framework. Должен ли я создать контекст на уровне RIA (ASP.Net) и передать его в BLL, затем в DAL, или я должен создать его в DAL и передать обратно результат LINQ?
Если я создаю его в DAL и передаю объект обратно, отложенная загрузка означает, что данных еще нет. Возможно ли, что мой контекст будет собран мусором, прежде чем я получу возможность фактически запросить мои данные из базы данных?
Будут ли у меня проблемы с потоками, если я создам контекст в моем DAL?
2 ответа
Если вы все равно используете RIA-сервисы, вы также можете использовать LinqToEntitiesDomainService< EfModelGoesHere> и позволить RIA-сервисам хранить один EF DataContext/ модель.
Мы используем наши собственные POCO для бизнес-логики, но службы RIA управляют всеми соединениями от клиента к нашим различным уровням данных (в том числе напрямую к EF). При необходимости мы передаем одну модель EF (которая хранится в члене ObjectContext контекста домена).
Было разумно сохранить ссылку на EF, а не переключаться на простой DomainService, и благодаря этому было очень легко добавлять быстрые (временные) дополнения к доменной службе, поскольку мы просто связываем LINQ непосредственно с моделью EF. Если нам удастся справиться с этим вниз, то мы будем постоянно возвращать его обратно на уровень RIA, чтобы использовать его.
Вы создаете контекст данных в своей части приложения Silverlight (клиент). Я обычно оставляю свой контекст в переменной в своем классе, чтобы я мог использовать его повторно. Он не будет собирать мусор, пока не исчезнут все ссылки на класс. Вот короткий пример асинхронной загрузки некоторых объектов (сущностей) из базы данных (с обратным вызовом для обработки возвращенных объектов):
public class MyClass
private _context as MyDomainContext
private _employees as list(of Employees)
public sub DoSomething()
_context = new MyDomainContext
_context.Load(_context.GetEmployeesQuery(), AddressOf EmployeesLoaded, Nothing)
end sub
public sub EmployeesLoaded(loadOp as LoadOperation(Of Employee))
_employees = new list(of Employee)(loadOp.entities)
end sub
end class