C# UserDetail在域和聚合中的位置如何?

C# UserDetail在域和聚合中的位置如何?,c#,.net,database,class-design,aggregate,C#,.net,Database,Class Design,Aggregate,我不确定如何处理UserDetail类 程序;虚拟帐户层次结构,用户帐户只能与主帐户进行交易。但是用户帐户可以进行某种类型的赌注,这将是帐户余额的损益 将MainAccount作为数据库聚合根目录感觉合乎逻辑,因为这些帐户构成了最重要的数据。现在看来,将UserDetail作为帐户聚合的一部分似乎还可以,但我认为在创建帐户之前创建一个用户可能会很有用。也许一个用户也可以有两个帐户。然后呢 我猜UserDetail可能只是一个独立的聚合。但是在这种情况下,在加载帐户聚合时,如何加载相应的UserD

我不确定如何处理UserDetail类

程序;虚拟帐户层次结构,用户帐户只能与主帐户进行交易。但是用户帐户可以进行某种类型的赌注,这将是帐户余额的损益

将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; }
    }

编辑:

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

单向

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,用于允许每个用户拥有多个帐户

我猜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;}
}
公共类用户现金账户{
公共IList详细信息{get;set;}
}
公开课详情{
公共用户现金帐户{get;set;}
}
公共类用户现金帐户{
公共Guid UserDetailsId{get;set;}
}
公开课详情{
公共Guid帐户ID{get;set;}
}
或这两种方法的任意组合。您还可以选择根本不引用此关系的一侧,也不具有双向关系

编辑:回复您的评论。您不想使用
HasOne()
,HasOne是一种非常罕见的真正1对1的关联类型,几乎没有数据库将关系编码为1对1,它们几乎总是多对1。这是一种
References()
关系

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

一个注意事项是,我最初的设计中确实存在一个错误,即双向关联UserDetails实际上是UserAccount对象上的一个集合,以避免需要真正的HasOne关联

我猜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;}
}
公共类用户现金账户{
公共IList详细信息{get;set;}
}
公开课详情{
公共用户现金帐户{get;set;}
}
公共类用户现金帐户{
公共Guid UserDetailsId{get;set;}
}
公开课详情{
公共Guid帐户ID{get;set;}
}
或这两种方法的任意组合。您还可以选择根本不引用此关系的一侧,也不具有双向关系

编辑:回复您的评论。您不想使用
HasOne()
,HasOne是一种非常罕见的真正1对1的关联类型,几乎没有数据库将关系编码为1对1,它们几乎总是多对1。这是一种
References()
关系

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


注意:我最初的设计中确实存在一个错误,要有一个双向关联,UserDetails实际上是UserAccount对象上的一个集合,以避免需要真正的HasOne关联。

注意,如果使用ID路径,显然必须在某个点手动加载对象。好的,我相信这很简单,我只是有一点大脑障碍,因为我以前从来没有这样做过。我是否知道您是否更正了我可以将一个属性“usercashcount”添加到UserDetail类中,并将其映射为HasOne(x=>x.Account).Cascade.None()?嗯,这将使它是双向的,也许没有必要..或者等等。。也许我可以让它保持我发布的状态,并将UserCashAccount的用户属性映射为HasOne(…).Cascade.None?这就是所需的全部内容,这将使UserDetail成为一个单独的聚合?我在我的回答中回答了你,我明白了。是的,如果允许多个帐户,它当然必须是参考。注意,如果你使用ID路径,你显然必须在某个点手动加载对象。好的,我相信这很简单,我只是有一点大脑障碍,因为我以前从未这样做过。我是否知道您是否更正了我可以将一个属性“usercashcount”添加到UserDetail类中,并将其映射为HasOne(x=>x.Account).Cascade.None()?嗯,这将使它是双向的,也许没有必要..或者等等。。也许我可以让它保持我发布的状态,并将UserCashAccount的用户属性映射为HasOne(…).Cascade.None?这就是所需的全部内容,这将使UserDetail成为一个单独的聚合?我在我的回答中回答了你,我明白了。是的,如果允许多个帐户,它当然必须是参考。