Entity Framework如何管理数据库连接?

3
假设以下是我们的业务层代码:
public class DatabaseInteract
{
    //`NewsEntities` is our ObjectContext
    public List<News> GetAllNews()
    {
         return new NewsEntities().News.OrderByDescending(q => q.RegidtrationDate).ToList();
    }

    public News GetNewsById(int newsId)
    {
         return new NewsEntities().News.FirstOrDefault(q => q.Id== newsId);
    }

    public bool IsNewsExist(int newsId)
    {
         var news = new NewsEntities().News.FirstOrDefault(q => q.Id== newsId);
         return news != null;
     }
}

以下是我们在ASP.NET MVC项目中的控制器代码:
public ActionResult Index(int? id)
{
    DatabaseInteract databaseInteract = new DatabaseInteract();
    ViewBag.AllNews = databaseInteract.GetAllNews(id.Value);
    ViewBag.News = databaseInteract.GetNewsById(id.Value);
    ViewBag.IsExist = databaseInteract.IsNewsExist(id.Value);
    return View(model);
}

现在,我的问题是:
在调用每个业务层方法时,我们是否有一个新的连接到数据库? 编辑: 以下代码是否适合确保在DatabaseInteract类的每个实例中只有一个连接到数据库:
public class DatabaseInteract 
{
    readonly NewsEntities _entities = new NewsEntities();

    //`NewsEntities` is our ObjectContext
    public List<News> GetAllNews()
    {
         return _entities.News.OrderByDescending(q => q.RegidtrationDate).ToList();
    }

    public News GetNewsById(int newsId)
    {
         return _entities.News.FirstOrDefault(q => q.Id== newsId);
    }

    public bool IsNewsExist(int newsId)
    {
         var news = _entities.News.FirstOrDefault(q => q.Id== newsId);
         return news != null;
    }
}

1
注意:除了使用.FirstOrDefault()并检查是否为空外,还可以使用.Any() - Hans Kesting
1个回答

7
Entity Framework 管理连接池,这意味着 EF 会在可能时重用连接,并仅在需要时创建新的连接。是否每次调用都会创建新的连接取决于许多因素。因此很难说任何给定的一组调用是否会创建新的连接。
总的来说,EF 在管理连接方面做得非常出色,除非您知道它是问题,否则不必担心。

请参阅我问题中的 Edit 部分。 - Mohammad Dayyan
@Mohammad - 你的编辑并没有改变我的答案。EF使用连接涉及许多因素,这取决于你的应用程序整体如何使用EF。因此,没有把握它只会使用一个连接,也没有把握它会使用多个连接。放松心情,不要担心。连接是在全局连接池中管理的,并且它们不依赖于数据上下文的单个实例。 - Erik Funkenbusch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接