在 Entity Framework 中使用 'using' 语句的正确方法

Correct way of using the 'using' statement in Entity Framework

我对使用 using 语句有一些疑问。我了解它的作用(如果我是正确的,它会处理所有打开的连接等),但我不确定我应该如何正确使用它。

我正在从事的项目不包含任何存储库,您不需要 Entity Framework。

基本上,我在我的方法中获取了一个 Guid 列表作为参数。这些 ID 用于餐厅,我想检索对这些餐厅给出的所有评论。

所以目前,我正在像这样检索列表:

public void DoSomething(List<Guid> restaurantIds)
{
    List<Review> reviews;
    using (var db = new Context())
    {
        reviews = db.Reviews.Where(x => restaurantIds.Contains(x.RestaurantId)).ToList();
    }
    //More stuff here
}

这是在 using 语句之外声明列表的常见不良做法吗?我想到了一些替代方案,但我(再次)不确定哪个更好。

  1. 在与 returns 列表完全相同的 class 中创建一个单独的方法。这样在我的 DoSomething 方法中,我可以像这样使用它: List<Review> reviews = GetReviewsFromRestaurants(restaurantIds);
  2. 我必须先创建上下文,然后在没有 using 块的情况下使用 LINQ 语句。不过,我必须在完成后调用 .Dispose()

我在示例中使用 using 语句时是否有问题?如果是这样,替代方案是否更好?如果不是这种情况,您能否举例说明我应该如何检索此列表?

"what is a bad practice" 通常没有放之四海而皆准的答案,您的问题也不例外。虽然通常有明显 不好的 做法,有时也有明显好的做法,但有很多因素会影响您的决定(例如您的要求、组织的规则或团队的经验) ).

您可以将上下文在 entity framework 中保留的时间超过片刻(尽管将其打开 非常长 可能也不是一个好主意),因为只要你确定你最后处理了它。但是,将 using 应用于上下文的方式也没有错。在 Web 应用程序中,上下文的使用时间通常很短,低级连接池通常可以使解决方案保持高性能。

关于 reviews 变量,我认为在 using 块之外声明它并没有什么不好。

1.建议使用单独的方法。实际上,您仍然可以使用存储库 class (RestaurantRepository) 来处理所有这些基本操作,例如:根据单个或多个标识符获取所有餐厅、创建新餐厅、更改餐厅的一些数据.

这确保您将业务逻辑与基本操作分开。

2。一次性上下文与显式 Dispose()。一次性上下文显然更好,因为即使您的代码失败,您也可以确保调用 Dispose()。

大图 - Entity framework 和上下文处理

这已经讨论过了 here. Also, this article 表明 dispose 并不像看起来那么必要。

就我个人而言,我一直采用工作单元模式以允许进行多项更改(在各种存储库/实体上)并且没有因为未处理上下文而遇到麻烦。

在这种情况下,大括号定义了自己的范围。您将在大括号范围外声明的变量将在大括号内可见并且没问题。

它实际上是 try catch 块的 shorthand。

List<Review> reviews;
var db = new Context();
try
{
   reviews = db.Reviews.Where(x => restaurantIds.Contains(x.RestaurantId)).ToList();
}
finally
{
  db.Dispose();
} 

而且您的代码片段比这要简洁得多。编译器将始终在 "used" 对象上调用 .Dispose