繁体   English   中英

在实体框架中不使用Dispose或Using()

[英]Not Using Dispose or Using() in Entity Framework

我一直在编写一个Web应用程序并学习实体框架。 如果我做错了事,我很好奇。 查询时我没有使用过dispose或使用语句。

我的存储库示例:

public User GetUserById(int sessionId)
{
    var user = (from u in db.Users where u.Id == sessionId select u).SingleOrDefault();
    return user;
}

我从中选择的用户表将具有与其他表关联的外键。 我认为关于实体的最酷的事情是,我可以返回整个User对象(由实体构建),然后允许我在控制器中执行类似User.MyOtherTable.SomeColumn

问题是我依赖于此,并在我的控制器中以一种愉快的方式来获取用户信息以及利用来自其他表的信息。 我现在意识到,如果像下面的代码那样关闭该连接:

public User GetUserById(int sessionId)
{   using(db)
    {
    var user = (from u in db.Users where u.Id == sessionId select u).SingleOrDefault();
    return user;
    }
}

我的控制器不再有权访问User.MyOtherTable.SomeColumn因为它将为null。 我真正的问题是,在实体应用程序中使用处置对我有多重要?

我强烈建议您使用using语句,并且也不要再依赖延迟加载了。

不用选择具有延迟加载属性的User对象,而是计算出所需的全部数据并将其投影到Model类,例如

public class UserWithOtherStuffModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OtherStuff { get; set; }
}

然后在您的方法中:

public UserWithOtherStuffModel GetUserById(int sessionId)
{
    using(db)
    {
        var user = (from u in db.Users 
            where u.Id == sessionId 
            select new UserWithOtherStuffModel{
                Id = u.Id,
                Name = u.Name,
                OtherStuff = u.MyOtherTable.SomeColumn
            }).SingleOrDefault();
        return user;
    }
}

这不仅意味着您限制了数据库调用的次数,而且还拥有与数据库模型无关的数据协定。 如果移动该列,则只需更新查询以指向新的地点/名称,视图就可以保持不变。

因此,在处置上下文时,将无法引用延迟加载的属性。 您需要通过释放控制器时释放上下文(我不记得MVC是否按请求执行此操作)或通过使用Action上的某些属性控制上下文的生存时间来延长上下文的生存时间。

可以在此问题中找到一些有关如何解决此问题的示例,该示例与您在此处提出的要求几乎相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM