0

基本上我有一个存储库来控制对我的 EF 模型的访问。它创建引用,然后根据正在访问的存储库,返回被请求的实体。现在我正在公开一个 IQueryable Get 方法,它将直接从活动的 ObjectContext 返回实体。好的做法告诉我,我应该将任何 ObjectContext 使用包装在 using 语句中,以确保它被正确处理,但是当我从存储库执行此操作时,我收到一个错误,即在控制器加载它时 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);
    }
4

2 回答 2

1

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

您确实确实希望确保处置 ObjectContext,否则最终可能会导致内存泄漏(尤其是因为它保留了所有物化实体)。

一个常见的解决方案是使用每个请求的 ObjectContext 生命周期。即,将 ObjectContext 存储在 ASP .NET 的 Request 对象中并处理 HttpApplication.EndRequest 事件,此时您可以处置 ObjectContext。

于 2011-04-21T00:08:17.963 回答
0

当然是安全的。很多人最后都会存根并有 2-3 层用于数据访问,只是确保您的代码是干净的。你如何得到你的对象取决于你,我认为务实是最好的方法。我认为为给定类型提供一个 Repository/Service 类来帮助抽象出可重复使用的特定查询非常棒,但是直接在控制器中公开上下文并不长。

于 2011-04-21T00:27:19.310 回答