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

Nhibernate 流畅映射:使用联接表和级联,nhibernate,fluent-nhibernate,mapping,fluent,Nhibernate,Fluent Nhibernate,Mapping,Fluent,当前在下表设置的映射方面遇到一些问题: Shop [1] [1] / \ [n] [n] Category-[m]---[n]-Article 行为应如下: 1-删除店铺时,应删除所有物品和类别 2-删除类别时,相关文章应取消分配,但不删除 3-删除文章时,相关类别应取消分配,但不得删除 以下是当前的映射: public clas

当前在下表设置的映射方面遇到一些问题:

               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");
    }
}
公共类商店地图:类地图
{
公共商店地图()
{
这张桌子(“商店”);
Id(x=>x.Id).Column(“Id”).GeneratedBy.Native();
Map(x=>x.Name).Column(“Name”);
HasMany(x=>x.Categories);
HasMany(x=>x.Articles);
}
}
公共类类别映射:类映射
{
公共类别映射()
{
本表(“类别”);
Id(x=>x.Id).Column(“Id”).GeneratedBy.Native();
Map(x=>x.Name).Column(“Name”);
参考文献(x=>x.Shop);
HasManyToMany(x=>x.Articles).Cascade.AllDeleteOrphan()
.表格(“物品类别”)
.ChildKeyColumn(“文章id”)
.ParentKeyColumn(“类别id”)
.Inverse();
}
}
公共类ArticleMap:ClassMap
{
公共物品地图()
{
本表(“条款”);
Id(x=>x.Id).Column(“Id”).GeneratedBy.Native();
Map(x=>x.Name).Column(“Name”);
参考文献(x=>x.Shop);
HasManyToMany(x=>x.Categories).Cascade.All()
.表格(“物品类别”)
.ParentKeyColumn(“文章id”)
.ChildKeyColumn(“类别id”);
}
}
删除类别(Session.Delete())时,NH也会尝试删除相关的文章。将级联模式更改为SaveUpdate将解决此问题,但会将条目保留在链接表*文章类别*中。总结:Cascade.SaveUpdate太懒了,Cascade.All太急切了

我尝试了映射中出现的所有方法,但找不到正确的映射方法(相当简单的模式)

非常感谢任何关于如何(流利地)绘制此地图的想法

提前谢谢


Sebi

由于Category.Articles被定义为关系的反面,因此条目保留在链接表中。要删除链接记录,您需要先从文章中删除该类别。删除之前,请删除该类别