gpt4 book ai didi

entity-framework-4 - 在层之间传递 Entity 对象的正确方法?

转载 作者:行者123 更新时间:2023-12-04 07:56:53 24 4
gpt4 key购买 nike

我刚刚开始学习 Entity Framework ,并且在将它与我的分层代码结构相结合方面取得了一些不错的进展。我有 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 方法中删除using,它就可以正常工作。

我知道这是危险的做法,因为 GC 可以在任何给定时间处理上下文并搞砸我的 BLL。

那么,层与层之间传递信息的正确方式是什么?我还需要传递上下文吗?

最佳答案

因为您要从 DAL 返回 IQueryable,所以您不能使用 using 语句。

查询延迟直到触发查询 - .ToList 在您的 BLL 中。

到那时,上下文已被释放。

仔细考虑使用 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();
}
}

关于entity-framework-4 - 在层之间传递 Entity 对象的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4101502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com