用using声明实体FrameWork上下文

这是声明entity framework上下文的最佳实践

function() { DBContext context = new DBContext(); //Entity code return ; } 

要么

 function() { using(DBContext context = new DBContext()) { //Entity code } } 

我们是否需要在EntityFrameWork中使用? 如果是,我的第二个问题

在DataAccess Layer中我执行EF并将结果存储在IEnumerable里面使用

我的DL

 function() { IEnumerable something = null; using(DBContext context = new DBContext()) { IEnumerable something = .... } return something; } 

在控制器中

 function() { List some = something.ToList(); } 

在我的控制器中我得到这个列表,因为我需要做一些查找操作

 "The operation cannot be completed because the DbContext has been disposed Entity Framework" 

是的我可以从DL返回一个列表,它工作正常

如果我使用IEnumerable,我该如何处理?

您可以通过在放置上下文之前调用IEnumerable上的.ToList()来避免延迟加载EF行为(即在您的using块中)

是的,使用是最佳实践,因为它可以清理您的上下文。 Using语句是以下的快捷方式:

 try { // Execute your code inside the using statement } finally { // Cleanup the context no matter what by calling .Dispose() } 

请记住,您的上下文可能会返回IEnumerables,并且由于EF支持延迟加载,因此在将它们提取到具体集合(即yourResult.ToList())之前,不会填充这些对象。

在这种情况下会出现常见的负面结果:

 public IEnumerable GetEmployeesInAccounting() { using(var myContext = new MyDbContext()) { return myContext.Employees.Where(emp => emp.Department == 'Accounting'); } } // Code that fails, Assuming Manager is a lazy loaded entity, this results in an exception but it compiles no problem var acctEmps = GetEmployeesInAccounting(); var something = acctEmps.First().Department.Manager.Department; 

您可以使用.Include(emp => emp.Manager) (linq扩展方法)并使用.ToList();绑定结果来避免这种情况.ToList();

一旦调用.ToList()方法,您的请求将立即执行到数据源。

这就是为什么你不能在你的控制器中执行.ToList()作为你的上下文放置在使用块的末尾。

在您的DL方法中,只需执行以下操作:

 IEnumerable function() { using(DBContext context = new DBContext()) { return something.ToList(); } } 

在你的控制器中,你将得到一个IEnumerable of Something:

 var mySomethingIEnumerable = DL.Function(); 

希望有所帮助!