FluentNHibernate从两端删除有效的级联?

时间:2012-11-05 11:50:09

标签: 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()
    {
        AuthoredSites = new List<Site>(); 
    }

    public virtual IList<Site> 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)
    { 
    }
}

我在删除网站和成员方面遇到了问题。

我在覆盖中尝试了各种反映射组合,但不可避免地我需要的一种情况不起作用。

我想要实现的是,当我删除网站上的所有成员时(记住他们仍然可以是其他网站上的作者) - 然后我希望删除该网站。

当我从会员中删除某个网站时,只有在没有其他作者的情况下才能删除该网站。

要使用的正确覆盖或映射配置是什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

正如@Damien_The_Unbeliever所说,这并不是说级联的目的是什么。但是,您可以配置NHibernate来为您处理这个问题。您可以使用Event Listener处理NHibernate中的事件,并根据需要执行“其他操作”。

我发现了这个Hibernate文档(移植了NHibernate),列出了可能的Event Listenerhttp://anandhansubbiah.com/blog/hibernate-events/

删除Event Listener可能就是你要找的东西。这将允许您检测即将被删除的对象(在您的情况下为MemberSite),并执行额外操作 - 例如检查是否需要删除其他对象。