用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();
希望有所帮助!
上述就是C#学习教程:用using声明实体FrameWork上下文分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031716.html