2011-06-07 65 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