gpt4 book ai didi

.net - Entity Framework - 加载子对象的策略

转载 作者:行者123 更新时间:2023-12-05 00:40:22 27 4
gpt4 key购买 nike

我得到了以下 2 个实体:User 和 Post

用户的简单版本:

public virtual int Id { get; set; }
public virtual IList<Post> Posts { get; set; }

默认情况下不加载帖子。

在某些情况下,我需要加载帖子(例如,我想计算该用户的帖子数)。现在,我在 UserRepository 中添加了一个方法调用 LoadPosts(User user):
_context.LoadProperty(user, "Posts");
  • 有没有更合乎逻辑的地方来放置该方法?
  • 我应该把它放在 PostRepository 中吗?像 CountPosts(int userId) 之类的东西?
  • 我应该在我的 LoadMethod 上提供一个重载吗?示例:Load(bool loadPosts)

  • 有没有办法,如果我写 myUser.Posts.Count() Posts 会自动加载而不是 null ?

    最佳答案

    您所描述的场景称为延迟加载,EF4 支持它。根据您的代码判断,您有 POCO 对象,并且由于您已将列表声明为 virtual , EF 可以创建代理以提供延迟加载功能。您可以使用一个设置来启用延迟加载:context.ContextOptions.LazyLoadingEnabled = true; .在这种情况下,每当您访问 Posts已加载的属性 User ,数据将从数据库加载。

    更多信息,在“延迟/延迟加载”部分:
    http://blogs.msdn.com/b/adonet/archive/2009/05/28/poco-in-the-entity-framework-part-2-complex-types-deferred-loading-and-explicit-loading.aspx

    The reason why this works is because when I marked my collection property as virtual, this allowed the Entity Framework to provide a proxy instance for my POCO type at runtime, and it is this proxy that does automatic deferred loading. The proxy instance is based on a type that derives from my own POCO entity class - so all functionality you have provided is preserved. From a developer point of view, this allows you to write persistence ignorant code even when deferred loading might be a requirement.



    并简要说明您的小问题 list :
  • 有没有更合乎逻辑的地方来放置该方法? - 如果您决定实现
    加载方法 Posts对于给定的
    用户自己,它在逻辑上属于UserRepository .
  • 我应该把它放在 PostRepository 中吗?类似于 CountPosts(int userId)
    ? - 它可能属于PostsRepository如果你加载
    与特定用户无关的帖子
    (例如,全局关键字搜索
    所有帖子)。
  • 我应该在我的 LoadMethod 上提供一个重载吗?示例:加载( bool
    loadPosts) - 是的,你可以这样做。
    但是,使用 EF,您只需要
    关闭延迟加载。邮报将
    与用户一起加载。
  • 关于.net - Entity Framework - 加载子对象的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639958/

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