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 有一些好处.
我想知道在这种情况下最佳做法是什么:
我有方法在 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 有一些好处.