domain-driven-design - 处理来自映射对象的实体更新

标签 domain-driven-design .net-core repository-pattern entity-framework-core repository-design

首先,我有代码,即用于对架构/表进行建模的SQL数据模型(使用EF Core 1.1)。但是,我还有域对象,这些域对象是这些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中描述的。基本上,它归结为将状态存储在显式状态对象中,显式状态对象是由实际域对象封装和维护的成组的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;
  }
  ...
}

关于domain-driven-design - 处理来自映射对象的实体更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43237042/

相关文章:

service - DDD : Blocking External Service Calls and Events

domain-driven-design - 何时使用领域事件与双重调度

domain-driven-design - DDD 处理随时间推移的聚合更新

c# - ASP.NET Core 如何执行 Linux shell 命令?

c# - 无法从单例 'ApplicationDbContext' 消耗作用域服务 'Microsoft.Extensions.Hosting.IHostedService'

design-patterns - 在另一个存储库中使用一个存储库

domain-driven-design - 领域服务控制粒度

c# - 如何使用 Kestrel ConnectionHandler 处理传入的 TCP 消息?

sql - 三层架构与存储库模式

c# - EF Core,数据库优先。如何将通用存储库接口(interface)移动到另一个程序集?