.NET:每个HTTP请求使用共享dbContext的缺点是什么(对多个dbContext,每个业务对象一个)

时间:2017-02-17 03:59:28

标签: .net asp.net-mvc entity-framework asp.net-mvc-4 dbcontext

假设我有实体: 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,但一般情况下不想获取数据?

0 个答案:

没有答案