отображение на одну из двух колонок / отображение многих на многие с помощью fluentnhibernate - PullRequest
0 голосов
/ 01 апреля 2011

Я пытаюсь отобразить следующее:

Пользователь может быть подключен к другому пользователю.Пользовательский класс имеет свойство «Соединения», которое является коллекцией UserConnection.UserConnection имеет две ссылки на пользователя, одну для запрашивающей стороны (тот, кто инициировал соединение) и одну для запрашивающей стороны (тот, кто является целью соединения).

Использование FluentNHibernate Я хочу загрузить все UserConnections для при загрузке пользователя.Соединения пользователя - это те, где идентификатор пользователя соответствует либо requestterId или requestteeId .

public class User
{
    //....
    public virtual IList<UserConnection> Connections { get; set; }
}

public class UserConnection
{
    //....
    public virtual User Requester { get; set; }
    public virtual User Requestee { get; set; }
}

Это похоже на отношения многие ко многим, но я не могу полностью обернуть это вокруг.Кто-нибудь может помочь?

РЕДАКТИРОВАТЬ:

Мое текущее сопоставление пользователя (ниже), очевидно, соответствует только на один столбец ...

HasMany(x => x.Connections).Inverse().Key(k => k.Columns.Add("Requestee_id")).Fetch.Select().Not.LazyLoad();

РЕДАКТИРОВАТЬ2:

Я рассмотрел этот подход , но я бы предпочел избежать этого, если это возможно ...

1 Ответ

1 голос
/ 01 апреля 2011

Разве это не 1-много? У пользователя есть коллекция подключений? Но каждое соединение имеет 1 RequesterUser или 1 RequesteeUser?

Это будет отношение со ссылками на себя, отображающее что-то вроде ниже.

    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Table("Users");
            DynamicUpdate();            
            References<User>(x => x.Requester)
                .Cascade.None()
                .NotFound.Ignore();
            References<User>(x => x.Requestee)
                .Cascade.None()
                .NotFound.Ignore();
            HasMany<User>(x => x.RequesterConnections)
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .KeyColumn("RequesterId");
            HasMany<User>(x => x.RequesteeConnections)
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .KeyColumn("RequesteeId");
        }
    }

Я могу быть совершенно не прав, не использовать NH долго, но, возможно, это вызовет некоторые идеи. Я думаю, что именно так я и попытаюсь это сделать.

Очевидно, у вас нет ни одной коллекции Соединений, но вы можете получить их оба довольно легко.

Надеюсь, это поможет. Кохан

...