我正在构建一个asp网站并使用Entity框架作为ORM。
我应该将实体框架工作实例放在哪里?
目前在每个控制器中我都有一个私有成员,如下所示:
MyDBEntities mDbContext = new MyDBEntities();
这意味着在每个请求中,都会创建一个新的控制器,然后创建一个新的mDbContext。此外,我在成员资格提供程序中mDbContext
(以检查用户是否是成员)和角色提供程序(以检查其角色)和某些绑定程序(以获取视图无法提供的某些数据),意思是我可以为每个页面请求创建3-4个与db的连接?
我可能做错了什么,但是做正确的方法是什么?
答案 0 :(得分:1)
至于控制器,这是完全可以的。 MVC的许多IoC示例都建议将构造函数注入到MVC控制器中,这几乎是相同的。
会员/角色提供者中的一个上下文实例不是一个好主意,因为他们是单身人士。上下文迟早会被多个线程解决。那里你应该有每个方法调用的上下文。
此处有更多详情:What could cause many data access exceptions using EF code first in a custom RoleProvider?。
答案 1 :(得分:0)
将数据库逻辑放在数据库类(例如存储库)中。
在该存储库中,您可以使用多个方法(getallcustomers
,savecustomer
等),这些方法都创建一个新的MyDBEntities
对象,并带有using
语句:
using (MyDBEntities mDbContext = new MyDBEntities())
{
//your db code here
}
据我所知,创建MyDBEntities
对象只不过是在ADO.Net中创建一个新连接,所以它是一个轻量级的操作。
您可以从控制器调用存储库方法。
如果你似乎经常从控制器使用一种方法(即每次请求多次),你可以考虑缓存。
答案 2 :(得分:0)
按照Unit Of Work
模式,demo web app here。