繁体   English   中英

在 foreach 循环中使用实体框架 DbContext 的 using 语句

[英]Use of using statement for Entity Framework DbContext in foreach-loop

有一个解析器可以解析包含对象定义的文本文件。 文本文件中的对象定义有一个占位符句柄键。 占位符句柄需要通过在 DB 中查找句柄值来替换为实际值。 在我的应用程序中,我使用 Entity Framework Core 来处理数据库。

解析器一次返回一个对象,我一次一个地在数据库中查找句柄和其他属性。 这是目前代码的样子:

    IEnumerable<ObjectInfo> GetNextContent();

    IEnumerable<ObjectInfo> GetNextObjectInfo()
    {

        foreach (var item in parser.GetNextContent())
        {
            using (var dbContext = new ContentDbContext())
            {
                string key = item.Key;

                string id = dbContext.Contents.Find(key).ObjectId;
                item.Id = id;
                // Assign other fields...

                yield return item;
            }
        }
    }

我的问题是在上面的代码中,'using' 块在 foreach 循环中。 这是正确的做法吗? 另一个想法是我可以在 foreach 循环之外使用 'using' 块,但是我不确定这将如何与代码中的迭代器一起使用。

您应该将ContentDbContext移到外部以获得更好的性能。

这仅仅是因为每个请求只需要一个context

每个 Web 请求一个 DbContext ......为什么?

using (var dbContext = new ContentDbContext())
 {
    foreach (var item in parser.GetNextContent())
     {
            string key = item.Key;

            string id = dbContext.Contents.Find(key).ObjectId;
            item.Id = id;
            // Assign other fields...

            yield return item;
        }
    }

更新

您也可以加入然后确保一次获取所有数据

// You need to fetch all `item.Key` from `parser.GetNextContent()` to get all data in `dbContext.Contents`
var keys = parser.GetNextContent().Select(p => p.Key).ToArray();

var result = (from content in dbContext.Contents 
              join key in keys on content.Id equals key 
              select new 
{
  Id = content.ObjectId,
  //....
}  

如果您使用的是 C# 8,则 using 语句可能如下所示:

 using var dbContext = new ContentDbContext();

 foreach (var item in parser.GetNextContent())
 {
        string key = item.Key;

        string id = dbContext.Contents.Find(key).ObjectId;
        item.Id = id;
        // Assign other fields...

        yield return item;
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM