使用using声明实体框架上下文

本文关键字:框架 上下文 实体 声明 using 使用 | 更新日期: 2023-09-27 18:09:51

声明实体框架上下文的最佳实践

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

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

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

在数据访问层中,我执行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?

使用using声明实体框架上下文

你可以通过在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<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();
绑定结果来避免这种情况。

您的请求将在您调用. tolist()方法时立即对数据源执行。

这就是为什么你不能在你的控制器中执行。tolist(),因为你的上下文已经在using块的末尾被处理了。

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

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

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

var mySomethingIEnumerable = DL.Function();

希望有帮助!