FluentNHibernate: множественные отношения один-ко-многим между одними и теми же объектами - PullRequest
3 голосов
/ 06 мая 2010

Я работаю над приложением отслеживания ошибок.Есть тикеты, и у каждого тикета есть открывающий пользователь и назначенный пользователь.Итак, в основном, у меня есть две сущности, которые имеют два отношения «многие к одному» друг с другом.Вот их схема:

Пользователь:

public class User
{
    public virtual int Id { get; protected set; }
    ...

    public virtual IList<Ticket> OpenedTickets { get; set; }
    public virtual IList<Ticket> AssignedTickets { get; set; }
}

Билет:

public class Ticket
{
    public virtual int Id { get; protected set; }
    ...

    [Required]
    public virtual User OpenerUser { get; set; }
    public virtual User AssignedUser { get; set; }
}

Я использую функцию автоматического сопоставления FluentNHibernate.

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

Я погуглил, но не нашел ничего полезного.

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

Я с помощью Стивса узнал, что мне нужно реализовать свою собственную IHasManyConvention.Я также обнаружил, что сгенерированное имя столбца в IHasManyConvention должно соответствовать имени столбца, сгенерированного моим IReferenceConvention.С небольшой настройкой я заставил его работать.

Я также шокирующе обнаружил, что вызов удобного метода ForeignKey.EndsWith("Id") портит все это.

Хотя ответ Стивса сам по себе не решаетпроблема, я очень благодарен за то, что он указал мне правильное направление.

1 Ответ

2 голосов
/ 06 мая 2010

Автоматическое сопоставление генерирует то же имя для своих столбцов внешнего ключа. Вы можете преодолеть это с помощью пользовательского соглашения, которое именует столбец внешнего ключа именем (сопоставленного) свойства:

class HasManyConvention : IHasManyConvention
{
    public void Apply(IOneToManyCollectionInstance instance)
    {
        instance.Key.Column(instance.Member.Name);
    }
}

// register convention using:
autoMapping.Conventions.Add(new HasManyConvention());
...