Свободный NHibernate создает только один дополнительный столбец для нескольких отношений HasMany - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть приложение-тезаурус, построенное на NHibernate.Модель данных очень проста:

public class Word
{
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }
    public virtual IList<Word> Synonyms { get; set; }
    public virtual IList<Word> Antonyms { get; set; }
}

Таким образом, каждое слово имеет список синонимов и список антонимов.Я думал, что сопоставление также будет прямым:

public class WordMapping : ClassMap<Word>
{
    public WordMapping()
    {
        Id(x => x.Id);
        Map(x => x.Text);
        HasMany(x => x.Synonyms).Cascade.AllDeleteOrphan();
        HasMany(x => x.Antonyms).Cascade.AllDeleteOrphan();
    }
}

Когда я смотрю на таблицу, сгенерированную в MS SQL Server 2008, я вижу только один ключевой столбец для двух отношений HasMany:

Id        int
Text      nvarchar(255)
Word_id   int

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

У меня есть проблема, привязанная правильно?Если так, как я могу это исправить?

1 Ответ

1 голос
/ 22 февраля 2011

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

Для моей проблемы я создал две отдельные таблицы:

-- Synonyms table --
WordId        int
SynonymId     int

-- Antonyms table --
WordId        int
AntonymId     int

Тогда в моем классе картирования:

public class WordMapping : ClassMap<Word>
{
    public WordMapping()
    {
        Id(x => x.Id);
        Map(x => x.Text);
        HasManyToMany(x => x.Synonyms).ParentKeyColumn("WordId")
                                              .ChildKeyColumn("SynonymId")
                                              .Table("Synonyms");
        HasManyToMany(x => x.Antonyms).ParentKeyColumn("WordId")
                                              .ChildKeyColumn("AntonymId")
                                              .Table("Antonyms");
    }
}

Это решает все проблемы.

...