实体框架和MVC在业务层或数据访问层中创建DbContext

时间:2013-03-27 22:48:26

标签: c# asp.net-mvc entity-framework

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

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

这样的情况,其中上下文来自业务层:

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;
    }

我很感激帮助!

1 个答案:

答案 0 :(得分:5)

数据访问层。创建一个“工作单元”类,它与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

基本上,它是将多个存储库/表组合在一起的中心位置,这样您就可以在不处理上下文的情况下对多个存储库执行操作。您不必完全按照所示使用它。您可以根据自己的需要进行修改。