UserDetail在哪里适合域和聚合?

时间:2011-06-07 19:18:21

标签: c# .net database class-design aggregate

我不确定如何处理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 个答案:

答案 0 :(得分: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。这是References()关系。

在HasOne的情况下,两个对象共享相同的主键。这种设计几乎从未在数据库系统中使用过。

我最初做的一个注意事项是我的设计有错误,因为UserDetails实际上是UserAccount对象上的一个集合,以避免需要真正的HasOne关联。