2013-03-27 65 views
2

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

那么可以在业务层方法中创建上下文,然后将其传递给数据访问层方法吗?还是有更好的方法来做到这一点?

像这样的事情在上下文来自于业务层:

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

EF *是* DAL。 – Moho 2013-03-27 22:49:55

+0

我明白你在说什么了。我刚刚创建了一个单独的项目,其中包含用于对由EF生成的实体执行CRUD操作的类。所以EF为每个表生成一个类,然后为每个表创建一个类来执行CRUD操作。这不是一个好主意吗? – ssn771 2013-03-27 22:54:53

+0

随着你如何描述你的方法,这更多的是一种可重复使用的模式。 orm负责dal和mapper。 – Justin 2013-03-27 23:12:08

回答

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

基本上,它是一个集中的地方,召集多个仓库/桌,这样就可以在多个存储库的作用不用设置你的背景。您不必完全按照所示使用它。您可以修改它以符合您的需求。