我首先得到了我的代碼,SQL數據模型(使用EF Core 1.1),用於模擬我的模式/表。但是我也有域對象,它們是這些SQL數據模型的部分或完整映射版本,實質上它們具有與SQL數據模型相同的形狀。

現在,我想知道當您在其跟踪上下文的上下文之外更改複雜對象時,處理級聯更新的最佳方法是什麼。當您認為我的所有域操作都不在被跟踪的實體上進行時,它們就發生在域對像上。

簡而言之,這就是我想要實現的目標。

1)從數據庫中讀取實體。

2)將實體映射到域對象。

3)對域對象應用更新。

4)將域對象映射回實體。

5)對映射的實體應用數據庫更新,這導致實體及其關聯的相關實體被更新。

順便說一下,實體和域對象具有可能遇到的典型的多對一關係。這樣做的最佳方法是什麼?

一般承認的答案

這樣做的最佳方法是什麼?

我認為最好的解決方法是首先使用一個足夠靈活的框架來避免問題,這個框架允許將域對象直接映射到數據庫而不需要太多的妥協,以避免模擬顯式持久性代碼中的模型。

實質上它們具有與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;
  }
  ...
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow