假设我有实体: StudentDm 和 StaffDm 处理数据库查询的Business Objects: StudentBo 和 StaffBo
学生和员工是数据库中完全不相关的2个表。
我一直在使用每个业务对象架构的一个DbContext,并使用每个HttpRequest使用共享的DbContext来执行Commit()。
以下是基本业务对象类 BaseBo
的代码public class BaseBo<T> where T : EntityBaseDm
{
private CompassDbContext context;
public DbSet<T> dbSet
{
get
{
CompassDbContext returnContext;
if (HttpContext.Current.Items["UnitOfWorkContext"] != null)
{
returnContext = (CompassDbContext)HttpContext.Current.Items["UnitOfWorkContext"];
}
else // otherwise: we are not in unitOfWork
{
if (context == null) // if this Bo did not instantiated a context, instantiated it
{
returnContext = context = new CompassDbContext();
}
else // otherwise get the already instantiated context
{
returnContext = context;
}
}
}
}
}
正如您所看到的,我从每个业务对象获取上下文的方式是:我检查我们是否在UnitOfWork中,如果是,请获取共享上下文。否则,为业务对象实例化一个单独的上下文。
我一直在关注这个架构,因为很多书都将它描述为标准。直到今天,我需要加入来自 StudentDm 和 StaffDm 的两个LINQ查询。然后它给我错误说,因为它们是2个不同的dbContext实例化,我无法加入它们。
然后我更改了 BaseBo ,以便我的所有Business Objects始终按照HTTP请求共享相同的dbContext,无论我们是否处于工作单元中。
像这样:
public DbSet<T> dbSet
{
get
{
CompassDbContext returnContext;
if (HttpContext.Current.Items["CompassDbContext"] == null) // if this Bo did not instantiated a context, instantiated it
{
returnContext = context = new CompassDbContext();
HttpContext.Current.Items["CompassDbContext"] = returnContext;
}
else // otherwise get the already instantiated context
{
returnContext = (CompassDbContext)HttpContext.Current.Items["CompassDbContext"];
}
return returnContext.Set<T>();
}
我想我的问题是:由于请求如此短暂,因此每个HTTP请求始终使用相同的dbContext有什么缺点?为什么工作单元可以共享一个单独的dbContext,但一般情况下不想获取数据?