Где UserDetail вписывается в домен и совокупность? - PullRequest
1 голос
/ 07 июня 2011

Я не уверен, что делать с классом UserDetail.

Программа; Виртуальная иерархия учетных записей, с учетными записями пользователей, которые могут иметь транзакции только к основному счету.Но 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()

Bi-Directional

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 Ответ

1 голос
/ 07 июня 2011

Полагаю, 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. Вы также можете вообще не ссылаться на 1 сторону этих отношений и не иметь двунаправленных отношений.

Редактировать: Отвечая на ваш комментарий. Вы не хотите использовать HasOne(), HasOne - это чрезвычайно редкий тип ассоциации, который действительно является 1-к-1, почти ни у одной базы данных никогда не было отношений, закодированных как 1-к-1, они почти всегда являются многими-к-1 , Это отношения References().

В случае HasOne оба объекта имеют один и тот же первичный ключ. Этот дизайн почти никогда не используется в системах баз данных.

Одна заметка, в которой у меня изначально была ошибка в моем дизайне, чтобы иметь двунаправленную ассоциацию, UserDetails фактически была бы коллекцией объекта UserAccount, чтобы избежать необходимости истинной ассоциации HasOne.

...