在多线程服务器中使用实体框架的最佳实践是什么?我正在使用实体框架ObjectContext来管理我的所有数据库操作,现在我知道这个上下文不是线程安全的,所以现在当我需要使用它来执行一些数据库操作时,我用lock声明来包围它是安全的.这是我应该怎么做的?
首先,我使用EF 6.0和Code First方法.我的context配置设置为启用"代理创建"和"延迟加载".
我的问题是:延迟加载是否与返回IEnumerable(而不是IQueryable)的方法的结果一起工作?
我认为下面的代码更具说明性:
public void Test()
{
var company = GetCompanies().FirstOrDefault();
if (company.Employees.Count() > 0)
{
//I got here without errors!
}
}
public IEnumerable<Company> GetCompanies()
{
var company = context.Companies.ToList();
//Note that I did not Include the Employee (child table)
return company;
}
Run Code Online (Sandbox Code Playgroud)
请注意评论,我说:"我来到这里没有错误!".这意味着即使在ToList()通话后延迟加载也能正常工作.我认为转换后IQueryable到List或IEnumerable在EF将失去做延迟加载的能力.
我已经注意到代理仍然启用了GetCompanies方法返回的实体(在debbug模式中,我可以看到丑陋的哈希,如:System.Data.Entity.DynamicProxies.Company_7035BEA374959AC1...).
即使在不同的DLL上调用它,延迟加载也可以工作.它是否正确?我的意思是,即使我的方法返回IEnumerable(而不是IQueryable),一个不同的DLL可以在我的数据库中进行后续调用吗?
任何澄清将不胜感激.