gpt4 book ai didi

c# - 我可以在没有上下文的情况下使用实体吗?

转载 作者:行者123 更新时间:2023-12-03 21:52:28 24 4
gpt4 key购买 nike

假设我有一个 User 实体,并创建了部分 User 类,以便我可以添加一些方法(例如使用 NHibernate)。我添加了 GetByID 以便更轻松地获取用户:

public static User GetByID(int userID)
{
using (var context = new MyEntities())
{
return context.Users.Where(qq => qq.UserID == userID).Single();
}
}

现在,在业务逻辑中的某个地方我想做这样的事情:

var user = User.GetByID(userID);
var posts = user.GetAllPostsForThisMonth();
foreach(var post in posts)
{
Console.WriteLine(post.Answers.Count);
}

GetAllPostsForThisMonth()GetByID 类似 - 具有上下文并在执行后立即处理它。

通常我不能这样做,因为当我调用 post.Answers.Count 时上下文就会被释放。我认为,这使得我的方法毫无用处......或者我错过了什么?我可以这样使用我的实体吗?或者我应该为我使用的每个查询创建方法(例如 post.GetAnswersCount())?提前致谢!

最佳答案

你所感叹的行为实际上是好的,因为它可以让你避免搬起石头砸自己的脚。如果您被允许这样做,则会导致到数据库的 n 次往返(其中 n 是帖子数),并且每一轮当您想要的只是计数时,-trips 会提取所有答案的所有数据。这可能会对性能产生巨大的影响。

您想要做的是构造一个对象来表示您希望从数据库中获得的所有信息,然后构造一个 LINQ 查询,该查询将实际加载您希望使用的所有信息。

public class PostSummary
{
public Post Post {get;set;}
public int AnswerCount {get;set;}
}

public IEnumerable<PostSummary> GetPostSummariesByUserAndDateRange(
int userId, DateTime start, DateTime end)
{
using (var context = new MyEntities())
{
return context.Posts
.Where(p => p.UserId == userId)
.Where(p => p.TimeStamp < start && p.TimeStamp > end)
.Select(new PostSummary{Post = p, AnswerCount = p.Answers.Count()})
.ToList();
}
}

这会生成一个 SQL 查询,并在一次往返中准确生成您想要的信息,而不会加载大量您不需要的信息。

更新

如果 NHibernate 的工作方式与 Java 的 Hibernate 类似,那么它也不会在上下文释放后执行延迟加载。 Entity Framework 确实为您提供了很多选择:哪一个最适合您将取决于您的具体情况。例如:

  • 您可以使上下文持续更长时间(例如 Web 应用程序中每个请求一次),而不是将上下文限制在数据访问方法内,以便延迟加载属性将继续在数据访问方法之外工作.
  • 您可以立即加载您知道需要的任何实体关联。

这是一个预先加载的示例:

public GetAllPostsAndAnswersForThisMonth()
{
using (var context = new MyEntities())
{
return context.Posts.Include("Answers")
.Where(p => p.UserID == UserID)
.ToList();
}
}

但是,由于 Entity Framework 基本上构成了您的“数据访问”层,因此我仍然认为最佳实践是创建一个类或一组类,以准确地模拟您的业务层实际想要从数据层中获得的内容,然后让数据访问方法生成这些类型的对象。

关于c# - 我可以在没有上下文的情况下使用实体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6600807/

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