Sco*_*tie 3 idisposable entity-framework-4 objectcontext
我只是学习实体框架,并在将其与我的分层代码结构相结合方面取得了一些进展.我有2个可视图层,一个业务层和一个数据访问层.
我的问题是在层之间传递实体对象.此代码示例不起作用:
// BLL
public static void Test1()
{
 List<User> users = (from u in GetActiveUsers()
      where u.ID == 1
      select u).ToList<User>();
 // Do something with users
}
// DAL
public static IQueryable<User> GetActiveUsers()
{
 using (var context = new CSEntities())
 {
  return from u in context.Users
      where u.Employee.FirstName == "Tom"
      select u;
 }
}
我收到错误消息ObjectContext实例已被释放,不能再用于需要连接的操作.
如果我从GetActiveUsers方法中删除使用它,它工作正常.
我知道这是危险的做法,因为GC可以在任何给定时间处理上下文并搞砸我的BLL.
那么,在层之间传递信息的正确方法是什么?我是否还需要传递上下文?
因为您从DAL 返回IQueryable,所以不能使用using语句.
查询将被推迟,直到触发BLL中的查询 - .ToList.
到那时,上下文被处理掉了.
想仔细了解使用IQueryable的,因为它是不知道所有的细节冒险的做法.
既然你还在学习EF,我会保持简单:
// BLL
public static void Test1()
{
 List<User> users = GetActiveUsers();
 var singleUser = users.SingleOrDefault(u => u.ID == 1);
 // Do something with users
}
// DAL
public static ICollection<User> GetActiveUsers()
{
 using (var context = new CSEntities())
 {
  var users = from u in context.Users
      where u.Employee.FirstName == "Tom"
      select u;
  return users.ToList();
 }
}
如果您想获得单个用户,请创建另一个方法:
// DAL
public static User GetSingleActiveUser(int userId)
{
 using (var context = new CSEntities())
 {
  var users = from u in context.Users
      where u.Employee.UserId == userId
      select u;
  return users.SingleOrDefault();
 }
}
| 归档时间: | 
 | 
| 查看次数: | 1158 次 | 
| 最近记录: |