Cascade使用NHibernate删除间接相关的对象

时间:2009-07-14 00:25:15

标签: c# fluent-nhibernate cascade

继我的other question给出以下类和流畅的地图之后,有没有办法在删除相关人员时自动级联删除DriversLicense?注意,我不希望Person类知道DriversLicense类,但如果Person被删除,我也不想要孤立数据。

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class PersonMap : ClassMap<Person>
{
        public PersonMap() { Id( x => x.Id ); }
}

public class DriversLicense
{
        public virtual Person Person { get; set; }
        public virtual string State { get; set; }

        public override bool Equals( object obj ){ ... }
        public override int GetHashCode(){ ... }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
        public DriversLicenseMap()
        {
                UseCompositeId().WithKeyReference( x => x.Person );
                Map( x => x.State );
        }
}

2 个答案:

答案 0 :(得分:0)

您无法以想要构建对象的方式执行此操作。如果您想将DriversLicense添加到Person类,您可以级联删除它。但正如您已经说过的那样,您不希望此人反对知道DriversLicense。

您实际需要做的是获取包含该人的所有驱动程序许可证,然后删除带有Cascade删除的DriverLicenses,这将删除人员记录和许可证。

(我最近没有在FNH堆栈上跟踪很多更改,因此可能会在某些时候重命名)您需要将地图更改为类似于:

public DriversLicenseMap()
{
        UseCompositeId().WithKeyReference( x => x.Person ).Cascade.All();
        Map( x => x.State );
}

编辑:添加新信息后,您实际需要做的是在Repository类中设置,您可以在其中处理删除Person以搜索具有该人员的所有驱动程序许可证。很可能你需要编写一个Criteria表达式来处理它。

获得该列表后,您要删除所有这些对象,并确保清除这些删除,然后删除人员记录并将其清除。

根据您解释的情况,您不希望孤立数据以您希望它受限制的方式,并且不希望在person类中包含驱动程序许可类,因此无法处理任何类型的级联删除(据我所知)。 )

答案 1 :(得分:-1)

由于业务原因,您无法将DriversLicense中的删除级联到Person,并且您真的不知道有关DriversLicense的人员,而您确实 em>这个要求的充分理由然后我认为你可以用两种方式之一来处理它:

  1. 将删除DriversLicense对象的责任进一步移动到您的服务或存储库级别并执行Chris建议的操作。在删除Person实体之前,查询Person的DriverLicnese对象并删除它们。

  2. 您可以创建一个Nhibernate Interceptor或EventHandler,为您执行删除操作。这种方法使您的存储库和域保持良好和干净,如果我无法从我的person对象引用DriveLicenese集合,那么这可能是我采取的方法。 (NHibernate Event Documentation