Entity Framework, Linq, ObjectContext и отложенное выполнение вопроса? - PullRequest
1 голос
/ 16 марта 2009

Я новичок в Linq для EntityFramework, один вопрос в Linq2EntityFramework, который у меня есть, - когда или если избавиться от ObjectContext. Причина, по которой я задаю этот вопрос, состоит в том, что обычно в моем DAL есть код, подобный

public List<User>  GetUsers()
{
    using (MyEntities db = new MyEntities())   //where MyEntities inherits ObjectContext. 
    {

       // do some linq select operation which returns IQueryable<User>
       // call ToList() on the return IQueryable which is when the DB is really accessed
       // then we return List<User>

    } 
    // after using statement a Dispose method on ObjectContext is called, hence disposed the ObjectContext,  and in turn it closes my DB connection and releases it to the pool
}

Теперь я не хочу этого делать, я хочу, чтобы мой DAL возвращал IQueryable для моего BLL вместо List, чтобы мой BLL мог выполнять фильтрацию, как Skip () для возвращенного IQueryable, а затем вызывать ToList () в BLL , Таким образом, код становится таким,

public IQueryable<User>  GetUsers()
{
   // do some linq select operation which returns IQueryable<User>
   // then just return what we got back
   // Note: no DB access occurred here, this is called deferred execution, because the real DB access happens later in BLL
}

Тогда в моем BLL есть метод, подобный

public List<User>  GetUsers()
{
   // get IQueryable<User> from DAL to a var say users     
    return  users.Skip(10).Take(20).ToList(); // here the DB access really happens.  Note: if we put using in DAL, here will throw exception saying DB is already closed!!
}

Мои вопросы,

  1. Если я воспользуюсь вторым подходом, узнает ли Linq2EF, что нужно закрыть соединение после завершения вышеуказанного метода?
  2. При втором подходе ObjectContext никогда не удаляется, будет ли это проблемой на больших сайтах?
  3. Или как мне вернуть IQuerayable, но при этом утилизировать ObjectContext в DAL?

Большое спасибо, Ray.

Редактировать : Одна вещь, которую я не понимаю, это то, что, если соединение разумно управляется ObjectContext, тогда можно ли просто не избавляться от ObjectContext? Что еще кроме ObjectContext управляет?

Ответы [ 4 ]

2 голосов
/ 17 марта 2009

По вашим вопросам:

  1. Он закроет открытое и закроет соединение с ToList, так как все перечисления происходят в этом месте. Только в этом месте вы можете получить длинное открытое соединение, если вы перечислите его и запустите полудлинную обработку для каждого элемента.
  2. Для нормальных больших сайтов и нормальной работы с этим все будет в порядке. Главное, что может привести к неприятностям, - это отслеживание сущностей, в которое входит любая загруженная вами сущность. Если вы загружаете слишком много информации или у вас очень большой сайт, вы можете избежать его использования (не беспокойтесь за нормальный сайт).
  3. Вы можете иметь свой класс доступа к данным для реализации IDisposable и распоряжаться текстовым текстом при его удалении. Таким образом, в вашем GetUsers вы можете вместо этого использовать класс доступа к данным.
1 голос
/ 16 марта 2009

Если вы находитесь в контексте веб-сайта, вам следует серьезно подумать о том, чтобы сделать его так, чтобы ваш ObjectContext действовал на протяжении всего запроса.

Вы должны держать ObjectContext вокруг для отложенной загрузки, теперь способ обойти это.

Соединения открываются и закрываются по мере необходимости во время запросов и SaveChanges, поэтому у вас не должно быть «утечки соединения».

1 голос
/ 16 марта 2009

Я склонен думать о EF ObjectContext как о DAL, который решает эту проблему. Если вы хотите, чтобы ваш собственный DAL инкапсулировал материал EF (не ужасная идея, IMO), я бы предложил сделать ваш DAL реализующим IDisposable.

0 голосов
/ 16 марта 2009

если вы хотите и IQueryable, вы можете сделать это, запросив результат ToList () и вернуть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...