这样做的最佳方法是什么?
我认为解决这个问题的最好方法是首先通过使用足够灵活的框架来避免该问题,以允许将域对象直接映射到数据库而无需太多妥协,以避免必须对显式持久性进行建模代码中的模型。
本质上,它们与 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;
}
...
}