9

我首先有我的代码,用于对我的模式/表建模的 SQL 数据模型(使用 EF Core 1.1)。但是,我也有域对象,它们是这些 SQL 数据模型的部分或完整映射版本,本质上它们与 SQL 数据模型具有相同的形状。

现在我想知道当您在跟踪上下文的上下文之外更改复杂对象时,处理级联更新的最佳方法是什么。当您认为我的所有域操作都不会发生在被跟踪实体上时,它们会发生在域对象上。

简而言之,这就是我想要实现的目标。

1)从数据库中读取实体。

2) 将实体映射到域对象。

3) 将更新应用于域对象。

4) 将域对象映射回实体。

5) 对映射实体应用数据库更新,从而更新实体及其关联的相关实体。

顺便说一句,实体和域对象具有可能遇到的典型多对一关系。这样做的最佳方法是什么?

4

1 回答 1

3

这样做的最佳方法是什么?

我认为解决这个问题的最好方法是首先通过使用足够灵活的框架来避免该问题,以允许将域对象直接映射到数据库而无需太多妥协,以避免必须对显式持久性进行建模代码中的模型。

本质上,它们与 SQL 数据模型具有相同的形状

如果您考虑一下,这意味着您的域模型(对象模型)和关系数据库模型之间的阻抗不匹配与域模型和显式持久性模型之间的阻抗不匹配相同。

尽管如此,还是有一种优雅的方式来执行 Vaughn Vernon 在Modeling Aggregates with DDD and Entity Framework中描述的映射。基本上,它归结为将状态存储在显式状态对象中,这些状态对象是由真实域对象封装和维护的 getter/setter 包。然后将这些状态对象映射到 EF。

例如取自上述链接文章

public class Product {
  public Product(
      TenantId tenantId,
      ProductId productId,
      ProductOwnerId productOwnerId,
      string name,
      string description) {
    State = new ProductState();
    State.ProductKey = tenantId.Id + ":" + productId.Id;
    State.ProductOwnerId = productOwnerId;
    State.Name = name;
    State.Description = description;
    State.BacklogItems = new List<ProductBacklogItemState>();
  }

  internal Product(ProductState state) {
    State = state;
  }
  ...
}
于 2017-04-05T20:11:37.600 回答