实体框架 - 我应该从BLL还是DAL调用DbContext

时间:2013-11-15 10:39:56

标签: entity-framework dbcontext

我正在创建一个包含以下图层的WPF应用程序:

UI(Views + ViewModels) - > BLL - > DAL

所有这些都引用了域模型层。

目前我正通过BLL将所有数据库调用从UI传送到DAL。 但我不确定这是正确的方法。

BLL中的大多数方法都是这样的:

public ICollection<User> GetUsers()
{
    return dbAccess.GetUsers();
}

反过来在DAL中调用类似的方法:

public ICollection<User> GetUsers()
{
    using (var context = new DbContext())
    {
        return context.Users.ToList();
    }
}

1)这种将呼叫从BLL传送到DAL的方式似乎非常多余。当然,有一些BLL方法实际上拥有一些业务逻辑。我应该放弃BLL吗?

2)这种方法的另一个问题是我不能使用延迟加载,因为DbContext是在DAL中创建和处理的。我猜这可以通过在ViewModel中创建DbContext来解决,但是什么时候应该将它处理掉呢?

3)最后,由于我没有使用延迟加载,我必须急于加载我的相关实体。 但并非所有视图都需要相同的相关实体,所以我经常会得到几个返回相同实体但具有不同包含的方法。这可以吗?

X)我所有的DB方法都存在于一个名为DbAccess的大型类中。为每个ViewModel(或者我的每个实体)创建一个DB服务类会更好吗?

1 个答案:

答案 0 :(得分:1)

可以直接从BL调用EF方法,但这会将你的BL绑定到EF太紧。如果您编写单独的DAL来访问EF,那么您可以在不触摸BL的情况下替换整个DAL,如果您直接从BL调用EF,则无法进行。

您还可以为每个httpRequest使用DbContext,如下所示

public static class ObjectContextPerHttpRequest
{
    public static MyEntities Context
    {
        get
        {
            string objectContextKey = HttpContext.Current.GetHashCode().ToString("ObjectContextPerHttpRequest");

            if (!HttpContext.Current.Items.Contains(objectContextKey))
            {
                HttpContext.Current.Items.Add(objectContextKey, new DomainModel.MyEntities());
            }

            return HttpContext.Current.Items[objectContextKey] as MyEntities;
        }
    }
}