【问题标题】:Is there a way to tell ef 4.1 which order the properties on an entity should be loaded in?有没有办法告诉 ef 4.1 应该加载实体上的属性的哪个顺序?
【发布时间】:2011-12-01 21:03:14
【问题描述】:

假设我有一个实体 Parent 和一个实体 Child,这样 Parent 就有一个虚拟的 ICollection Children 属性。在数据库中,这是从子表到父表的简单外键。

现在假设我在 Parent 上有一个名为 Text 的标量字符串属性。在Text属性的set方法中,我想访问Children集合属性中的实例。

当 EF 4.1 从 db 重构 Parent 实体时(例如由于 ToList() 调用),它会调用 Text 属性的 set 方法,而且它似乎总是在填充 Children 集合之前这样做。

有没有办法告诉 EF 在对 Text 标量字符串属性调用 set 之前先对 Children 虚拟集合属性调用 set?

【问题讨论】:

  • 您的属性设置器(设置Text 属性和设置子集合)的行为取决于您调用它们的顺序-x.Text = "a"; x.Children = someChildren; 给出的结果不同于x.Children = someChildren; x.Text = "a";,无论您是否手动执行或者如果 EF 在对象实现期间执行此操作。不知何故,我对这样的属性设置器有一种不好的感觉。我会考虑重写这段代码。我不认为你可以影响 EF 中实体实现的内部实现。

标签: entity-framework-4.1


【解决方案1】:

您应该遵循@Slauma 的评论建议并更改代码,因为这对于持久属性来说是错误的行为。即使以下描述有效,也很容易出错,因为您总是需要以特定方式查询数据。

根据您加载实体的方式,您的问题可以分为多个部分。

延迟加载:

如果你加载Parent andChild`是延迟加载你不能实现反向加载。

// Now parent is loaded
var parent = context.Parent.First(); 

// Even with lazy loading enabled and your setter accessing nav. property it
// should not load child collection because lazy loading should be temporarily
// turned off during entity materialization to avoid unexpected lazy loads

(未测试)您可以尝试先手动加载所有子节点,然后再请求父节点:

// Now all child for given parent are loaded
var child = context.Child.Where(c => c.Parent.Id == ...).ToList();

// Now parent is loaded and if you are lucky it configures navigation property
// to loaded child prior to evaluating your setter - I guess setter will be 
// evaluated prior to fixing navigation properties so it will not work
var parent = child[0].Parent;

显式加载也会遇到同样的问题。

渴望加载:

问题是一样的,是基于how Include works的方式。

因此,如果您将子级包含在父级中,则父级将首先实现。

var parent = context.Parent.Include("Child").First();

在这种情况下,反向操作很可能没有帮助,因为调用

var childs = context.Child.Include("Parent").Where(...).ToList();

将逐个评估记录,每个记录将包含单个子项和父项,因此我认为第一次访问父项时,您将只有一个子项,并且您将再次依赖于 EF 执行的操作顺序(相同延迟加载的问题)。

【讨论】:

  • 感谢您的解释。我会改变的。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多