宣布实体框架上下文的最佳实践
function()
{
DBContext context = new DBContext();
//Entity code
return ;
}
或
function()
{
using(DBContext context = new DBContext())
{
//Entity code
}
}
我们是否需要在EntityFrameWork中使用?如果是,我的第二个问题
在DataAccess Layer中执行EF并使用
将结果存储在IEnumerable中MY 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,我该如何处理?
答案 0 :(得分:8)
您可以在处理上下文之前调用.ToList()
上的IEnumerable
来避免延迟加载EF行为(即在using
块内)
答案 1 :(得分:6)
是的,使用是最佳做法,因为它可以清理您的上下文。 Using statement是以下的快捷方式:
try {
// Execute your code inside the using statement
}
finally {
// Cleanup the context no matter what by calling .Dispose()
}
请记住,您的上下文可能会返回IEnumerables,并且由于EF支持延迟加载,因此在将它们提取到具体集合(即yourResult.ToList())之前,不会填充这些对象。
在这种情况下会出现一个常见的负面结果:
public IEnumerable<Employee> 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();
答案 2 :(得分:3)
只要您调用.ToList()方法,您的请求就会被执行到数据源。
这就是为什么你不能在你的控制器中执行.ToList()作为你在使用块末尾处理的上下文。
在您的DL方法中,只需执行以下操作:
IEnumerable<Something> function()
{
using(DBContext context = new DBContext())
{
return something.ToList();
}
}
在您的控制器中,您将获得IEnumerable of Something:
var mySomethingIEnumerable = DL.Function();
希望有所帮助!