基本上我有一个存储库来控制对我的EF模型的访问。它创建引用,然后根据所访问的存储库返回所请求的实体。现在我正在公开一个IQueryable Get方法,该方法将直接从实时ObjectContext返回Entity。好的做法告诉我,我应该在using语句中包含任何ObjectContext使用以确保它被正确处理,但是当我从存储库执行此操作时,我得到一个错误,即在控制器加载它时ObjectContext已经被处理掉了。我已经删除了使用,然后它工作得很好,但我想知道一个人应该如何处理这个问题。我想保持一个IQueryable返回,因为我可能需要在它上面执行各种命令。有什么建议?如果多个HTTP请求开始进入,EF是否有助于保护我不会打开连接?
出错:
public IQueryable<IUser> Get
{
get
{
using (var context = new DrinkersPassportEntities(_connString))
{
return context.Users.AsQueryable();
}
}
}
工作但不能帮我晚上睡觉:
public IQueryable<IUser> Get
{
get
{
var context = new DrinkersPassportEntities(_connString);
return context.Users.AsQueryable();
}
}
我的控制器现在所做的就是:
public ViewResult Index( )
{
return View(userRepo.Get);
}
答案 0 :(得分:1)
有些人会告诉你,你的存储库不应该返回Queryables ....但是我不买。
您确实希望确保丢弃ObjectContext,否则最终会导致内存泄漏(特别是因为它保留了所有物化实体)。
常见的解决方案是使用每请求的ObjectContext生存期。也就是说,将ObjectContext存储在ASP .NET的Request对象中并处理HttpApplication.EndRequest事件,此时您将处理ObjectContext。
答案 1 :(得分:0)
确定它是安全的。很多人都存在并且有2-3层用于数据访问,最后确保你的代码是干净的。你如何获得你的对象取决于你,我认为务实是下注的方法。我认为为给定类型提供一个Repository / Service类来帮助抽象出被重用的特定查询很好,但是直接在控制器中公开上下文并没有多长时间。