处理来自映射对象的实体更新

Handling entity updates from a mapped object

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

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

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

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

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

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

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

5) 对映射的实体应用数据库更新,这会导致更新实体及其关联的相关实体。

顺便说一下,实体和域对象具有典型的多对一关系,人们可能 运行 进入这种关系。执行此操作的最佳方法是什么?

What is the best way to go about doing this?

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

in essence they sort of have the same shape as the SQL data models

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

Vaughn Vernon 在 Modeling Aggregates with DDD and Entity Framework 中描述的映射仍然有一种优雅的方法。基本上,它归结为将状态存储在显式状态对象中,这些对象是由真实域对象封装和维护的 getters/setters 包。然后使用 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;
  }
  ...
}