Entity Framework + 'using' 模式最佳实践

Entity Framework + 'using' pattern best practice

我想知道在这种情况下最佳做法是什么:

我有方法在 using 语句(一次性数据库上下文)中调用其他方法,而其他方法也需要访问数据库上下文,所以这是选项 1:

using (var db = new Database())
{
      // some code here

      //calling other function 
      var cnt = SomeFunction();
}

int SomeFunction()
{
    using (var db = new Database())
    {
      // some code here for example:
      return db.Users.Count();

    }
}

这里是选项 2:

using (var db = new Database())
{
    // some code here

   //calling other function 
   var cnt = SomeFunction(db);
}

int SomeFunction(Database db)
{
   return db.Users.Count();
}

注意:Database 看起来不怎么样。像这样:

 public class Database : IdentityDbContext<User>
{
    public Database()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        Configuration.LazyLoadingEnabled = true;
    }


    public DbSet<IdentityUser> AspNetUsers { get; set; }
}

我会选择选项 2,因为不需要再次初始化数据库上下文,但我不确定这样做是否正确。

DbContext 个实例有自己的变更追踪器。如果您想在 SomeFunction 中使用 changed DbSet,请使用相同的 DbContext。如果没有,你可以选择任何你喜欢的。

我会选择选项 3:使您的 SomeFunction 过载。

int SomeFunction()
{
  using (var db = new Database())
    return SomeFunction(db);
}

int SomeFunction(Database db)
{
  return db.Users.Count();
}

让调用者决定是否传入现有的Database。有时它是有道理的,如果调用者已经有一个,就像你的例子一样。其他时候,调用者只需执行一个数据库操作,然后通过不打扰调用者创建 Database 和记住正确处理它的责任来简化 API 有一些好处.