我一路上正在编写一个网络应用程序并学习实体框架。如果我做错了什么,我很好奇。我在查询时没有使用过 dispose 或 using 语句。
我的存储库示例:
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
因为这将为空。我真正的问题是,在实体应用程序中使用 dispose 对我来说有多重要?
我强烈建议您使用 using 语句,并且停止依赖延迟加载。
而不是选择User
具有延迟加载属性的对象,计算出您需要的完整数据并将其投影到模型类,例如
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;
}
}
这不仅意味着您限制了数据库调用的数量,而且您还拥有一个与数据库模型无关的数据协定。如果移动该列,只需更新查询以指向新的地点/名称,视图就可以保持不变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)