流畅的NHibernate只为多个HasMany关系生成一个额外的列

时间:2011-02-22 03:20:10

标签: c# nhibernate sql-server-2008 fluent-nhibernate

我有一个基于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

我认为这会导致插入数据时发生一些奇怪的事情。当我在完成一些插入后获取列表时,SynonymsAntonyms都包含相同的Words,但Words只是看似任意的子集。两个清单。

我的问题是否正确?如果是这样,我该如何解决?

1 个答案:

答案 0 :(得分:1)

我离开了基地。我假设FNH正在为HasMany关系生成一个单独的表(事实并非如此)。在此处找到正确的代码:Fluent NHibernate Self Referencing Many To Many

根据我的问题,我创建了两个单独的表:

-- 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");
    }
}

这解决了所有问题。