EntityFramework - 加载子对象的策略

Mel*_*sus 4 .net entity-framework repository

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

简单版用户:

public virtual int Id { get; set; }
public virtual IList<Post> Posts { get; set; }
Run Code Online (Sandbox Code Playgroud)

邮件默认不加载.

在某些情况下,我需要加载帖子(例如,我想计算该用户的帖子数量).现在,我在UserRepository中添加了一个方法调用LoadPosts(用户用户):

_context.LoadProperty(user, "Posts");
Run Code Online (Sandbox Code Playgroud)
  • 是否有更合理的地方放置该方法?
  • 我应该把它放在PostRepository中吗?类似于CountPosts(int userId)?
  • 我应该在LoadMethod上提供过载吗?示例:Load(bool loadPosts)

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

Yak*_*ych 6

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

更多信息,请参阅"延迟/延迟加载"部分:http: //blogs.msdn.com/b/adonet/archive/2009/05/28/poco-in-the-entity-framework-part-2-复杂类型递延装载和显式-loading.aspx

这样做的原因是因为当我将我的集合属性标记为虚拟时,这允许实体框架在运行时为我的POCO类型提供代理实例,并且正是此代理执行自动延迟加载.代理实例基于从我自己的POCO实体类派生的类型 - 因此保留了您提供的所有功能.从开发人员的角度来看,这允许您编写持久性无知代码,即使可能需要延迟加载.

简要介绍一下您的小问题列表:

  • 是否有更合理的地方放置该方法?- 如果您决定实现一个方法来Posts自己加载给定用户,那么它在逻辑上属于 UserRepository.
  • 我应该把它放在PostRepository中吗?类似于CountPosts(int userId)?- 它可能属于 PostsRepository您加载与特定用户无关的帖子(例如,所有帖子中的全局关键字搜索).
  • 我应该在LoadMethod上提供过载吗?示例:加载(bool loadPosts) - 是的,您可以这样做.但是,使用EF,您只需关闭延迟加载.帖子将与用户一起加载.