用using声明实体FrameWork上下文

时间:2013-04-17 11:25:00

标签: c# entity-framework

宣布实体框架上下文的最佳实践

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,我该如何处理?

3 个答案:

答案 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();

希望有所帮助!