流畅映射:使用连接表和级联

时间:2010-11-15 14:55:37

标签: nhibernate fluent-nhibernate mapping fluent

目前对下表设置的映射有点麻烦:

               Shop
             [1]  [1]                 
            /       \
          [n]       [n]
   Category-[m]---[n]-Article

行为应如下:
1 - 删除商店时,应删除所有文章和类别 2 - 删除类别时,相关条款应取消分配但不删除 3 - 删除文章时,相关类别应取消分配但不删除

这是当前的映射:

public class ShopMap: ClassMap<Shop>
{
    public ShopMap()
    {
        this.Table("shop");
        Id(x => x.Id).Column("id").GeneratedBy.Native();
        Map(x => x.Name).Column("name");

        HasMany(x => x.Categories).Cascade.AllDeleteOrphan;
        HasMany(x => x.Articles).Cascade.AllDeleteOrphan;
    }
}

public class CategoryMap: ClassMap<Category>
{
    public CategoryMap()
    {
        this.Table("category");
        Id(x => x.Id).Column("id").GeneratedBy.Native();
        Map(x => x.Name).Column("name");

        References(x => x.Shop);

        HasManyToMany(x => x.Articles).Cascade.AllDeleteOrphan()
                                    .Table("article_category")
                                    .ChildKeyColumn("article_id")
                                    .ParentKeyColumn("category_id")
                                        .Inverse();
    }
}

public class ArticleMap: ClassMap<Article>
{
    public ArticleMap()
    {
        this.Table("article");
        Id(x => x.Id).Column("id").GeneratedBy.Native();
        Map(x => x.Name).Column("name");

        References(x => x.Shop);

        HasManyToMany(x => x.Categories).Cascade.All()
                                    .Table("article_category")
                                    .ParentKeyColumn("article_id")
                                    .ChildKeyColumn("category_id");
    }
}

删除类别(Session.Delete())时,NH也会尝试删除相关文章。将级联模式更改为 SaveUpdate 将解决此问题,但会将条目保留在链接表* article_category *中。总结:Cascade.SaveUpdate太懒了,Cascade.All太急切了。

我尝试了映射中出现的所有内容,但无法找到正确的映射方式(相当简单的架构)。

关于如何(流利地)映射这些的任何想法都非常感谢!

提前致谢

塞比

1 个答案:

答案 0 :(得分:1)

条目保留在链接表中,因为Category.Articles被定义为关系的反面。在删除之前,您需要从Article.Categories中删除Category,以便删除链接记录。