LINQ to Entity Entity Initialization - PullRequest
       12

LINQ to Entity Entity Initialization

4 голосов
/ 08 мая 2009

В руководствах по ASP.Net MVC код LINQ to Entities выглядит следующим образом:

public class MyController : Controller
{
    private Models db;

    public ActionResult Index()
    {
        db = new Models();
        var foo = (from f in db.foo select f).ToList();
        return View(foo);
    }
}

Я предполагаю, что это как-то связано с безопасностью потоков / пулами соединений, но я просто хотел узнать, знает ли кто-нибудь какие-либо веские причины не делать этого так:

public class MyController : Controller
{
    private readonly Models db = new Models();

    public ActionResult Index()
    {
        var foo = (from f in db.foo select f).ToList();
        return View(foo);
    }
}

Ответы [ 4 ]

4 голосов
/ 08 мая 2009

Я просто собрал совет, который охватывает это довольно много деталей.

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

В некоторых ситуациях это правило не выполняется, но они довольно редки.

См. Это: Совет 18 - Как выбрать срок службы для вашего ObjectContext

1 голос
/ 08 мая 2009

Из примеров кода, которые я видел, вы должны написать искомый код следующим образом:

public class MyController : Controller{
    public ActionResult Index()
    {
        using (var db = new Models())
        {
            var foo = db.Foo.ToList();
            return View(foo);
        }
    }
}

Здесь есть два основных изменения.

  1. Модель EF является идентифицируемым объектом и должна быть утилизирована надлежащим образом. Это не разрушит ваше приложение, если вы этого не сделаете (GC очистит его позже), но лучше очистить его пораньше, если сможете.
  2. В вашем LINQ действительно нет необходимости в элементе from / select, он ничего не делает в этом сценарии.

Хотя вам следует рассмотреть архитектуру вашего приложения в целом и подумать об абстрагировании доступа к данным вне вашего контроллера.

1 голос
/ 08 мая 2009

Хранение внутри метода гарантирует, что база данных будет создаваться только при необходимости и добавляться в пул соединений, когда это необходимо. Я бы даже сделал следующий шаг и создал бы его внутри оператора using.

public class MyController : Controller
{
    public ActionResult Index()
    {
        using (Models db = new Models())
        {
            var foo = (from f in db.foo select f).ToList();
            return View(foo);
        }
    }
}
0 голосов
/ 08 мая 2009

первый фрагмент кода не должен компилироваться. Вы назначаете поле только для чтения в методе, который не является конструктором. Вы уверены, что это образец MVC?

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