2011-06-10 59 views
8

我正在使用微型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內我想打電話給MarkNew()兩個一ClientDatabase和用戶,然後提交()。現在我想要發生的事情是,首先保存ClientDatabase(子實體),然後爲ClientDatabase上設置的Id(作爲其數據庫插入的結果)在User之前設置爲Client上的ClientDatabaseId外鍵屬性然後也被插入到數據庫中。我只是想知道是否有人用一種很好的通用方式解決了這類問題?

回答

5

爲什麼不直接使用用戶類別作爲Aggregate Root。因此,在爲代碼插入數據庫之前,請檢查ClientDatabase是否爲空。如果不爲空,那麼您可以檢查Id屬性以查看它是否爲新的ClientDatabase或現有的(要決定是否需要執行插入或更新)。然後你可以填充ClientDatabaseId屬性。