工作單元模式 - 管理父子關係

c# dapper design-patterns orm unit-of-work

我正在使用micro-orm(dapper),並試圖為我的存儲庫提供一個工作單元(UoW)實現。我有點難以理解如何最好地處理我的UoW中的親子(外鍵)關係。例如,如果我有以下兩個直接映射到數據庫表的實體:

public class User
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string Name { get; set; }
    public int ClientDatabaseId { get; set; }

    public ClientDatabase ClientDb { get; set; }
}

public class ClientDatabase
{
    public int Id { get; set; }
    public string DataSource { get; set; }
    public string FailoverPartner { get; set; }
    public string InitialCatalog { get; set; }
}

用戶通過外鍵User.ClientDatabaseId與ClientDatabase建立父子關係的位置。 User和ClientDatabase上的Id屬性是Identity列。我的UoW接口定義如下:

public interface IUnitOfWork
{
    void MarkDirty(object entity);
    void MarkNew(object entity);
    void MarkDeleted(object entity);
    void Commit();
    void Rollback();
}

在某些時候,在同一個IUnitOfWork中,我想為ClientDatabase和User調用MarkNew(),然後調用Commit()。現在我想要發生的是首先保存ClientDatabase(子實體),然後將ClientDatabase上設置的Id(由於它的數據庫插入)設置為User之前的ClientDatabaseId外鍵屬性然後也插入數據庫。我只是想知道是否有人以一種很好的通用方式解決了這類問題?

一般承認的答案

為什麼不直接將用戶類用作聚合根 。因此,在對代碼插入數據庫之前,將檢查ClientDatabase是否為空。如果不為null,則可以檢查Id屬性以查看它是新的ClientDatabase還是現有的ClientDatabase(以決定是否需要執行插入或更新)。然後,您可以填充ClientDatabaseId屬性。



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