Использование ссылок (многие-к-одному) в Fluent NHibernate создает внешний ключ на обоих концах, на многих концах и на одном конце - PullRequest
0 голосов
/ 30 марта 2012

Как следует из названия, я хотел бы создать отношения многие-к-одному, используя Fluent NHibernate. Есть GroupEntries, которые принадлежат группе. Сама Группа может иметь другую Группу в качестве родительской.

Это мои сущности:

public class GroupEnty : IGroupEnty
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    ...
    public virtual IGroup Group { get; set; }
}

public class Group : IGroup
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    ...
    public virtual IGroup Parent { get; set; }
}

А это файлы сопоставления:

public class GroupEntryMap : ClassMap<GroupEntry>
{
    public GroupEntryMap()
    {
        Table(TableNames.GroupEntry);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Group);
    }
}

public class GroupMap : ClassMap<Group>
{
    public GroupMap()
    {
        Table(TableNames.Group);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Parent);
    }
}

При такой конфигурации Fluent NHibernate создает следующие таблицы:

GroupEntry
bigint Id     string Name     ...     bigint Group_id

Group
bigint Id     string Name     ...     bigint Parent_id     bigint GroupEntry_id

Я не знаю, почему он создает столбец "GroupEntry_id" в таблице "Группа". Я только картирую другую сторону отношений. Есть ли ошибка в моей конфигурации или это ошибка? Тот факт, что «GroupEntry_id» создается с ограничением «не ноль», доставляет мне много хлопот, иначе мне, вероятно, было бы все равно.

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

Редактировать: Я НЕ хочу создавать двунаправленную ассоциацию!

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Если вам нужно много-к-одному, когда в группе много записей группы, я бы ожидал, что ваши модели будут выглядеть примерно так:

    public class GroupEntry : IGroupEntry
    {
       public virtual long Id { get; set; }
       public virtual string Name { get; set; }
        ...
       public virtual IGroup Group { get; set; }
    }

    public class Group : IGroup
    {
       public virtual long Id { get; set; }
       public virtual string Name { get; set; }
        ...
       public virtual IList<GroupEntry> GroupEntries { get; set; }
       public virtual IGroup Parent { get; set; }
    }

Обратите внимание, что у группы есть список объектов GroupEntry,Вы сказали:

Я не знаю, почему он создает столбец "GroupEntry_id" в таблице "Группа".Я только сопоставляю другую сторону отношения.

Вам необходимо отобразить обе стороны отношения, многие стороны и одну сторону.Ваши отображения должны выглядеть примерно так:

    public GroupEntryMap()
    {
        Table(TableNames.GroupEntry);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Group);  //A GroupEntry belongs to one Group
    }
}

public class GroupMap : ClassMap<Group>
{
    public GroupMap()
    {
        Table(TableNames.Group);
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name).Not.Nullable();
        ...
        References<Group>(x => x.Parent);
        //A Group has-many GroupEntry objects
        HasMany<GroupEntry>(x => x.GroupEntries); 
    }
}

Проверьте беглое wiki , чтобы получить больше примеров.

0 голосов
/ 02 апреля 2012

Решение состояло в том, что я случайно назначил одно и то же имя таблицы для двух разных объектов ... Позор мне: (

Хотя большое спасибо за ввод!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...