处理映射对象的实体更新

Lut*_*ndo 9 domain-driven-design repository-design repository-pattern entity-framework-core .net-core

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

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

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

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

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

3)对域对象应用更新.

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

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

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

pla*_*alx 3

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

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

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

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

尽管如此,还是有一种优雅的方法来执行映射,Vaughn Vernon 在使用 DDD 和实体框架进行聚合建模中描述了这一点。基本上,它归结为将状态存储在显式状态对象中,这些对象是由真实域对象封装和维护的 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;
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)