Создание DataContext в каком слое? - PullRequest
0 голосов
/ 05 ноября 2010

Я создаю новое приложение Silverlight, используя RIA.Я использую бизнес-уровень и уровень доступа к данным, это выглядит примерно так ...

Silverlight-> ASP.Net/RIA-> Библиотека классов C # BLL-> Библиотека классов C # DAL Моя модель инфраструктуры объектовдоступно во всех слоях.

Я не уверен, где создать DataContext для моих запросов Entity Framework.Должен ли я создать контекст на уровне RIA (ASP.Net) и передать его в BLL, затем в DAL, или я должен создать его в DAL и передать обратно результат LINQ?

ЕслиЯ создаю его в DAL и передаю объект обратно, отложенная загрузка означает, что данных еще нет.Возможно ли, что мой контекст будет собран мусором до того, как я получу возможность фактически запрашивать свои данные из базы данных?

Будут ли у меня проблемы с потоками, если я создаю контекст в моем DAL?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2010

Если вы все равно используете RIA-сервисы, вы также можете использовать LinqToEntitiesDomainService <<em> EfModelGoesHere > и позволить сервисам RIA хранить один EF DataContext / модель.

Мы используем наши собственные POCO для бизнес-логики, но службы RIA управляют всеми соединениями от клиента к нашим различным уровням данных (в том числе напрямую к EF). При необходимости мы передаем одну модель EF (которая хранится в элементе ObjectContext контекста домена).

Считалось правильным сохранить ссылку на EF, а не переключаться на простой DomainService, и благодаря этому добавление быстрых (временных) добавлений к доменной службе стало действительно простым, поскольку мы просто связываем LINQ непосредственно с моделью EF. Если нам удастся справиться с этим вниз, мы будем постоянно вытягивать его обратно на уровень RIA, чтобы использовать его.

0 голосов
/ 05 ноября 2010

Вы создаете контекст данных в своей части приложения 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
...