entity-framework - Entity Framework - 我应该从 BLL 还是 DAL 调用 DbContext

标签 entity-framework dbcontext

我正在创建一个具有以下层的 WPF 应用程序:

UI( View + ViewModel)-> 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 来解决,但是我应该什么时候处理它?<​​/p>

3)最后,由于我没有使用延迟加载,所以我必须立即加载相关实体。 但并非所有 View 都需要相同的相关实体,因此我经常会得到几种返回相同实体但包含不同内容的方法。这样可以吗?

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

最佳答案

可以直接从 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;
        }
    }
}

关于entity-framework - Entity Framework - 我应该从 BLL 还是 DAL 调用 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19999105/

相关文章:

entity-framework - EF6 : Composite Primary Key Field as Foreign Key (ALTER TABLE statement conflicted with the FOREIGN KEY constraint)

entity-framework - 在 Entity Framework 6 中的一个事务中删除多行时重复查询

c# - 使用最小起订量模拟 EF DbContext

asp.net - 在 MVC 中使用 DBContext 语句

c# - 插入实体不会更新键字段

c# - 过滤 IQueryable 子列表

asp.net - 何时在 WebForms 页面生命周期中实例化 DbContext?

asp.net-mvc-4 - 检索单个字段值时的 FirstOrDefault()

c#-4.0 - 使用 IQueryable<TEntity> 代替 DbSet<TEntity> 问题

c# - 更新具有多对多关系的断开连接的实体