目前对下表设置的映射有点麻烦:
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太急切了。
我尝试了映射中出现的所有内容,但无法找到正确的映射方式(相当简单的架构)。
关于如何(流利地)映射这些的任何想法都非常感谢!
提前致谢
塞比
答案 0 :(得分:1)
条目保留在链接表中,因为Category.Articles被定义为关系的反面。在删除之前,您需要从Article.Categories中删除Category,以便删除链接记录。