在NHibernate中映射此场景的最佳方法是什么?

时间:2013-06-10 20:18:50

标签: c# nhibernate nhibernate-mapping

我有一个包含关键字的表格。我有几个其他表可以有多个关键字(从关键字表中提取)。这是我所拥有的,有效的,但感觉有更好的方法来映射它。我只是不确定它会是什么(如果有的话)

public class Keyword
{
    public virtual int Id {get; protected set;}
    public virtual string Name {get; set;}
}

public class KeywordMap : ClassMap<Keyword>
{
    public KeywordMap()
    {
        Id(x => x.Id).Not.Nullable().GeneratedBy.Identity();
        Map(x => x.Name).Not.Nullable.Length(100);
    }
}

public class Article
{
    public virtual int Id {get; protected set;}
    //... other properties omitted
    public virtual IList<Keyword> Keywords {get; set;}
}

public class ArticleMap : ClassMap<Article>
{
    public ArticleMap()
    {
        Id(x => x.Id).Not.Nullable().GeneratedBy.Identity();
        HasMany(x => x.Keywords).Inverse().Cascade.Delete();
    }
}

public class Picture
{
    public virtual int Id {get; protected set;}
    //... other properties omitted
    public virtual IList<Keyword> Keywords {get; set;}
}

public class PictureMap : ClassMap<Picture>
{
    public PictureMap()
    {
        Id(x => x.Id).Not.Nullable().GeneratedBy.Identity();
        HasMany(x => x.Keywords).Inverse().Cascade.Delete();
    }
}

1 个答案:

答案 0 :(得分:0)

从片段中我不确定你想要实现什么......似乎有一个表'[Keywords]',它有两列'Picture_Id'和'Article_Id'。

因此它用于PictureArticle(其他引用为null)。它也可能意味着,“名称”列中有多个相同的值...如果我确实正确读取了

我想在这种情况下更合适的是many-to-many关系。单组唯一Keyword.Name。然后会有每个关系[ArticleKeyword] [PictureKeyword]

的配对表

如果是这种情况,我们可以像这样进行映射(请参阅Fluent NHibernate HasManyToMany() MappingFluent NHibernate - HasManyToMany...

public ArticleMap()
{
    Id(x => x.Id).Not.Nullable().GeneratedBy.Identity();
    HasManyToMany<Keyword>(x => x.Keyword)
      .Table("ArticleKeyword")
      .ParentKeyColumn("Article_Id") // lot of mapping could be omited 
      .ChildKeyColumn("Keyword_Id")  // thanks to conventions 
      ;

更多关于多对多的阅读