实体框架和存储库,将开放上下文传递给控制器​​是否安全?

时间:2011-04-20 23:54:08

标签: entity-framework repository objectcontext

基本上我有一个存储库来控制对我的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);
    }

2 个答案:

答案 0 :(得分:1)

有些人会告诉你,你的存储库不应该返回Queryables ....但是我不买。

您确实希望确保丢弃ObjectContext,否则最终会导致内存泄漏(特别是因为它保留了所有物化实体)。

常见的解决方案是使用每请求的ObjectContext生存期。也就是说,将ObjectContext存储在ASP .NET的Request对象中并处理HttpApplication.EndRequest事件,此时您将处理ObjectContext。

答案 1 :(得分:0)

确定它是安全的。很多人都存在并且有2-3层用于数据访问,最后确保你的代码是干净的。你如何获得你的对象取决于你,我认为务实是下注的方法。我认为为给定类型提供一个Repository / Service类来帮助抽象出被重用的特定查询很好,但是直接在控制器中公开上下文并没有多长时间。