我有一个基于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
只是看似任意的子集。两个清单。
我的问题是否正确?如果是这样,我该如何解决?
答案 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");
}
}
这解决了所有问题。