2011-06-07 62 views
1

我不確定如何處理UserDetail類。UserDetail適用於域和聚合?

程序;具有UserAccounts的虛擬帳戶層次結構,該帳戶層次結構只能擁有朝向MainAccount的交易。但是UserAccounts可以進行某種類型的投注,這對賬戶餘額來說是一種盈利/損失。

感覺邏輯有MainAccount作爲數據庫聚合根,作爲賬戶形成的最重要的數據。現在看起來,將UserDetail作爲帳戶聚合的一部分看起來沒問題,但是我甚至可以在創建帳戶之前創建用戶。也許用戶也可能被允許擁有兩個賬戶。那又怎麼樣?

我猜UserDetail可能是隻是一個獨立的集合體。但在這種情況下,如何在加載帳戶聚合時加載相應的UserDetail?

請,如果你有一些解決這個想法,將不勝感激。

順便說一句,我使用FluentNHibernate。

域:

public class MainCashAccount 
    { 
     public int Id { get; set; } 
     public IList<UserCashAccount> UserCashAccounts { get; set; } 
     public IList<Transaction> UserAccountTransactions { get; set; } 
    } 
    public class UserCashAccount 
    { 
     public int Id { get; set; } 
     public UserDetail User { get; set; } 
     public IList<Bet> Bets { get; set; } 

     public UserConnection Connection { get; set; } // Not persisted/mapped 
    } 
    public class UserDetail 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string LoginName { get; set; } 
     public string Password { get; set; } 
    } 

其他:

public class UserConnection 
    { 
     public TcpClient TcpClient { get; set; } 

編輯:

可能的解決方案:(??)

單向

Class UserCashAccountMap 
    ... 
    HasOne(x => x.User).Cascade.None() 

雙向

Class UserDetail 
    ...(as above) 
    public UserCashAccount Account {get; set;} 

Class UserCashAccountMap 
    ... 
    HasOne(x => x.User).Cascade.None() 

Class UserDetail 
    HasOne(x => x.Account).Cascade.None().Inverse() 

..或者參考,而不是HasOne,用於允許每個用戶的多個帳戶。

回答

1

我猜UserDetail可能只是一個獨立的聚合。但在這種情況下,如何在加載帳戶聚合時加載相應的UserDetail?

通過使MainAccount對象的主鍵成爲UserDetail對象上的外鍵。

您特別是圍繞着有自參考實體與否的問題,從你的陳述我引用你可以在一堆的方式定義你的模型。你可以做

public class UserCashAccount { 
    public IList<UserDetail> Details {get;set;} 
} 

public class Details { 
    public UserCashAccount Account {get;set;} 
} 

public class UserCashAccount { 
    public Guid UserDetailsId {get;set;} 
} 

public class Details { 
    public Guid AccountId {get;set;} 
} 

或這些2的任意組合。你也可以選擇不引用這個關係的一邊,而不是有雙向關係。

編輯:響應您的評論。您不想使用HasOne(),HasOne是一種非常罕見的關聯類型,它確實是1對1關係,幾乎沒有數據庫將關係編碼爲1對1關係,但它們幾乎總是多對一。這是一個References()的關係。

在HasOne的情況下,兩個對象共享相同的主鍵。這種設計幾乎從未在數據庫系統中使用過。

一個說明我本來有一個錯誤在我的設計中,有一個雙向關聯的UserDetails實際上是UserAccount對象的集合,以避免需要一個真正的HasOne關聯。

+0

請注意,如果您使用ID路線,您顯然必須手動加載某個對象。 – 2011-06-07 19:32:10

+0

好吧,我確定這很簡單我只是有一個小腦袋,因爲我從來沒有這樣做過。我理解你是否正確,我可以將一個屬性「UserCashAccount帳戶」添加到UserDetail類,並將其映射爲HasOne(x => x.Account).Cascade.None()?嗯,這會使它成爲雙向的,也許沒有必要.. – bretddog 2011-06-07 19:46:43

+0

或等待..也許我可以在發佈時留下它,並將UserCashAccount的User屬性映射爲HasOne(...)。Cascade.None?這就是所需要的,並會使UserDetail成爲一個單獨的聚合? – bretddog 2011-06-07 19:52:15