继我的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 );
}
}
答案 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>这个要求的充分理由然后我认为你可以用两种方式之一来处理它:
将删除DriversLicense对象的责任进一步移动到您的服务或存储库级别并执行Chris建议的操作。在删除Person实体之前,查询Person的DriverLicnese对象并删除它们。
您可以创建一个Nhibernate Interceptor或EventHandler,为您执行删除操作。这种方法使您的存储库和域保持良好和干净,如果我无法从我的person对象引用DriveLicenese集合,那么这可能是我采取的方法。 (NHibernate Event Documentation)