Entity Framework 和 MVC 在业务层或数据访问层创建 DbContext

Posted

技术标签:

【中文标题】Entity Framework 和 MVC 在业务层或数据访问层创建 DbContext【英文标题】:Entity Framework and MVC create DbContext in business layer or data access layer 【发布时间】:2013-03-27 22:48:26 【问题描述】:

我是 Entity Framework 和 .NET 的新手,正在构建 MVC 4 应用程序。我想我对应该在哪里创建数据库上下文实例有点困惑。在我的应用程序中,我有几个层:Web、业务、数据访问、数据库(这些都是单独的项目)。在数据访问层,每个表都有一个类。我看到的一个示例显示了在数据访问层内的每个方法中创建上下文(我可能误解了它)。当更新多个表作为业务逻辑的一部分时,这似乎不太实用。在每个数据访问层方法中创建新上下文的结果似乎是这个错误:An entity object cannot be referenced by multiple instances of IEntityChangeTracker when updates multiple tables.

那么在业务层方法中创建上下文然后将其传递给数据访问层方法是否可以接受?还是有更好的方法?

上下文来自业务层的情况如下:

public User RetrieveUserById(int id, MyDbContext ctx)
                
        User findUser = ctx.Users.Find(id);
        return findUser;
    

而不是在数据访问层方法中创建上下文:

public User RetrieveUserById(int id)
    
        var ctx = new MyDbContext();
        User findUser = ctx.Users.Find(id);
        return findUser;
    

感谢您的帮助!

【问题讨论】:

我明白你在说什么。我刚刚创建了一个单独的项目,其中包含用于对 EF 生成的实体执行 CRUD 操作的类。所以 EF 为每个表生成一个类,然后我为每个表创建一个类来执行 CRUD 操作。这不是个好主意吗? 根据您描述方法的方式,这更像是一种存储模式。 orm 负责 dal 和 mapper。 【参考方案1】:

数据访问层。创建一个与 DbContext 一起存在于数据层中的“工作单元”类。 尝试搜索“Asp.net 工作单元模式”。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application1

基本上,它是汇集多个存储库/表的中心位置,因此您可以在不处理上下文的情况下对多个存储库进行操作。您不必完全按照所示使用它。您可以修改它以满足您的需要。

【讨论】:

以上是关于Entity Framework 和 MVC 在业务层或数据访问层创建 DbContext的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 和 MVC 在业务层或数据访问层创建 DbContext

MVC 脚手架不支持 Entity Framework 6 或更高版本

如何在MVC 5的类库项目中使用Entity Framework 6 Code First

使用 Entity Framework 6.1 和 MVC 5 从数据库中使用 Code First 后如何同步模型?

在 MVC 中使用 Entity Framework Code First 更新现有数据库

MVC3 Entity Framework 4.1RC @Html.DropDownListFor 如何实际工作?