13

我们如何告诉 Entity Framework 关于Aggregates的信息?

  1. 保存聚合时,将实体保存在聚合中
  2. 删除聚合时,删除聚合中的实体
  3. 当两个不同的用户尝试修改同一聚合中的两个不同实体时引发并发错误
  4. 加载聚合时,即使在我们访问聚合中的所有实体之前存在一些时间延迟,也要提供聚合的一致时间点视图

(实体框架 4.3.1 代码优先)

4

2 回答 2

7

EF 提供的功能允许您定义聚合并使用它们:

  1. 这是最痛苦的部分。EF 使用实体图。如果您有像 Invoice 这样的实体,并且该实体具有相关 InvoiceLine 实体的集合,您可以像聚合一样处理它。如果您在附加场景中,一切都按预期工作,但在分离场景中(EF 未加载聚合或由不同的上下文实例加载),您必须将聚合附加到上下文实例并准确告诉它您更改了什么 = 设置状态对于对象图中的每个实体和独立关联。
  2. 这由级联删除处理 - 如果您加载了相关实体,EF 将删除它们,但如果您不这样做,则必须在数据库中的关系上配置级联删除。
  3. 这由数据库中的并发令牌处理 - 最常见的是时间戳或行版本列。
  4. 您必须在开始时使用预先加载并一起加载所有数据(= 一致的观点),或者您将使用延迟加载,在这种情况下您将不会有一致的观点,因为延迟加载将加载当前的关系状态,但它不会更新您已经加载的聚合的其他部分(如果您尝试使用 EF 实现这种刷新,我认为这是性能杀手)。
于 2012-06-16T16:41:51.070 回答
6

我专门为此目的编写了GraphDiff 。它允许您通过提供流畅的映射来定义更新时的“聚合边界”。我在需要来回传递分离的实体图的情况下使用了它。

例如:

// Update method of repository
public void Update(Order order)
{
    context.UpdateGraph(order, map => map
        .OwnedCollection(p => p.OrderItems);
}

以上将告诉实体框架更新订单实体并合并 OrderItems 的集合。以这种方式映射允许我们确保实体框架仅在我们在聚合上定义的范围内管理图形并忽略所有其他属性。它支持对所有实体的乐观并发检查。它处理更复杂的场景,还可以处理多对多场景中的更新引用(通过 AssociatedCollections)。

希望这可以使用。

于 2014-01-07T16:29:24.720 回答