LINQ到实体实体初始化

时间:2009-05-07 21:10:47

标签: c# .net asp.net-mvc linq linq-to-entities

在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 个答案:

答案 0 :(得分:4)

我只是提出了一个非常详细的介绍。

您对线程的有根据的猜测只是为什么在需要它的方法中构造/处理Context通常更好的众多原因之一。

在某些情况下,这个经验法则不成立,但它们非常罕见。

请参阅:Tip 18 - How to decide on a lifetime for your ObjectContext

答案 1 :(得分:1)

从我见过的代码示例中,您应该编写您想要的代码,如下所示:

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

这里有两个主要变化。

  1. EF模型是IDisposable对象,应妥善处理。如果你不这样做,它不会破坏你的应用程序(GC会在以后清理它),但如果可以的话,最好尽早清理它。
  2. 你的LINQ中确实没有必要使用from / select的东西,在这种情况下它没有做任何事情。
  3. 虽然您应该考虑整个应用程序架构,并考虑在控制器之外抽象数据访问。

答案 2 :(得分:1)

将其保留在方法中可确保db只在需要时进行实例化,并在需要时添加到连接池中。我甚至会采取下一步并在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);
        }
    }
}

答案 3 :(得分:0)

第一个代码段不应该编译。您在不是构造函数的方法中分配只读字段。你确定它是一个MVC样本吗?