C# FluentNHibernate,两端都有有效的级联删除?
我有两个对象(多对多)站点和成员部分显示为:C# FluentNHibernate,两端都有有效的级联删除?,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有两个对象(多对多)站点和成员部分显示为: public class Site { public Site() { SiteAuthors = new List<Member>(); } public virtual IList<Member> SiteAuthors { get; set; } ... } public class Member { public Member() {
public class Site
{
public Site()
{
SiteAuthors = new List<Member>();
}
public virtual IList<Member> SiteAuthors { get; set; }
...
}
public class Member
{
public Member()
{
AuthoredSites = new List<Site>();
}
public virtual IList<Site> AuthoredSites { get; set; }
...
}
公共类站点
{
公共网站()
{
SiteAuthors=新列表();
}
公共虚拟IList站点作者{get;set;}
...
}
公共班级成员
{
公职人员()
{
AuthoredSites=新列表();
}
公共虚拟IList AuthoredSites{get;set;}
...
}
我将映射保留为默认值,覆盖如下所示:
public class MemberOverride : IAutoMappingOverride<Member>
{
public void Override(AutoMapping<Member> mapping)
{
mapping.HasManyToMany(x => x.AuthoredSites).Cascade.AllDeleteOrphan();
}
}
public class SiteOverride : IAutoMappingOverride<Site>
{
public void Override(AutoMapping<Site> mapping)
{
}
}
public类成员覆盖:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.HasManyToMany(x=>x.AuthoredSites).Cascade.AllDeleteOrphan();
}
}
公共类SiteOverride:IAutoMappingOverride
{
公共无效替代(自动映射)
{
}
}
我在适当地删除网站和成员时遇到问题
我在覆盖中尝试了各种逆映射的组合,但不可避免地我需要的一种情况不起作用
我想要实现的是,当我从一个站点中删除所有成员(记住他们仍然可以是其他站点上的作者)时,我希望该站点被删除
当我从一个成员中删除一个站点时,只有在没有其他作者的情况下才能删除该站点
要使用的正确覆盖或映射配置是什么
谢谢你的帮助。正如不信者@Damien_所说,级联并不完全是这样工作的。但是,您可以配置NHibernate来为您解决这个问题。您可以使用
事件侦听器处理NHibernate中的事件,并根据需要执行“其他操作”
我发现这个Hibernate文档(NHibernate的移植来源)列出了可能的事件侦听器
s:
Delete事件侦听器很可能就是您要查找的对象。这将允许您检测即将被删除的对象(在您的情况下是成员
和站点
),并执行一些额外的操作,如检查是否需要删除其他对象。这不是级联在数据库中的工作方式-它们更符合“如果我删除此网站,请删除所有附加到该网站的成员”-即删除父网站将删除所有子网站。您正在寻找相反的结果(如果不存在子网站,请删除父网站)这在我所知道的大多数数据库系统中都不存在。我可以不用级联就使用它吗?似乎AllDeleteOpan表明我应该能够正确地做我想做的事情?就像,如果站点没有作者,那么就删除它?