我不确定如何处理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,允许每个用户使用多个帐户。
答案 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关联。