简体   繁体   English

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

[英]FluentNHibernate with a valid cascade delete from both ends?

I have two objects (many-to-many) Site and Member partially shown as: 我有两个对象(多对多)站点和成员部分显示为:

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; }
    ...
}

I have left the mapping as default, overrides look like this: 我将映射保留为默认值,覆盖如下所示:

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)
    { 
    }
}

I am having problems deleting sites and members appropriately. 我在删除网站和成员时遇到问题。

I have tried various combinations of inverse mappings in the overrides, but inevitably one of the cases I need doesn't work. 我已在覆盖中尝试了各种逆映射组合,但不可避免地我需要的其中一种情况不起作用。

What I want to achieve is that, when I delete all the members from a site (remember they can still be authors on other sites) - then I want the site to be removed. 我想要实现的是,当我删除一个站点的所有成员(记住他们仍然可以是其他站点上的作者) - 然后我希望删除该站点。

When I delete a site from an member, then the site should only be remove if there are no other authors for it. 当我从成员中删除某个站点时,只有在没有其他作者的情况下才能删除该站点。

What is the correct override or mapping configuration to use? 要使用的正确覆盖或映射配置是什么?

Thanks for your help. 谢谢你的帮助。

As @Damien_The_Unbeliever has said, this is not quite how cascades are intended to work. 正如@Damien_The_Unbeliever所说,这并不是说级联的目的是什么。 However, you can configure NHibernate to take care of this for you. 但是,您可以配置NHibernate来为您处理这个问题。 You can handle events in NHibernate with an Event Listener and do "something else" as you need to. 您可以使用Event Listener处理NHibernate中的Event Listener ,并根据需要执行“其他”操作。

I found this Hibernate documentation (what NHibernate was ported from) that lists the possible Event Listener s : http://anandhansubbiah.com/blog/hibernate-events/ 我发现了这个Hibernate文档(NHibernate的移植文件)列出了可能的Event Listenerhttp//anandhansubbiah.com/blog/hibernate-events/

The Delete Event Listener s are likely what you are looking for. 删除Event Listener很可能是您正在寻找的。 This would allow you to detect objects (in your case Member and Site ) that are about to be deleted, and do something extra - like check to see if other objects need to be deleted. 这将允许您检测即将被删除的对象(在您的情况下是MemberSite ),并执行额外操作 - 例如检查是否需要删除其他对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM