2009-07-14 42 views
0

除了我的other question给予以下类和流利的地图,有没有办法自动级联删除DriversLicense相关的人被删除?请注意,我不希望Person类拥有任何有关DriversLicense类的知识,但是如果某个Person被删除,我也不希望孤立的数据。级联删除间接相关的对象与NHibernate

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

回答

-1

因为你不能在级联从DriversLicense到人删除,出于商业原因,你真的不知道是什么人对DriversLicense和你有一个真正之所以这样要求,那么我认为你可以通过以下两种方式之一处理它:

  1. 将负责删除DriversLicense对象的权限转移到您的服务或存储库级别,并执行Chris的建议。查询一个人的DriverLicnese对象并删除它们,然后删除Person实体。

  2. 您可以创建一个Nhibernate拦截器或EventHandler,为您执行删除操作。这种方法会让您的存储库和域名变得干净整洁,如果我无法从我的person对象中引用DriveLicenese集合,可能会采取这种方法。 (NHibernate Event Documentation

0

你不能用你想要构造对象的方式做到这一点。如果您想将DriversLicense添加到Person类,您可以级联删除它。但是,正如你已经说过的,你不希望这个人对象有任何有关DriversLicense的知识。

实际上您需要做的是获取包含该人员的所有驱动程序许可证,然后使用级联删除删除DriverLicenses,并删除该人员记录和许可证。

(我并没有跟随对FNH最近堆栈的变化很多,因此有可能它得到了在某些时候改名)你需要改变你的地图类似于:

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

编辑:随着新信息添加了您实际需要做的事情是在您的Repository类中设置删除Person来运行搜索具有该人员的所有驾驶执照的人员。很可能您需要编写一个Criteria表达式来处理该表达式。

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

由于您解释了不希望孤立数据的方式,您希望它受到限制,并且不希望在人类中拥有驱动程序许可证类,所以无法处理任何类型的级联删除(就我的知识而言。)

+0

我应该早一点的人可能失去他们的驾驶执照规定,但仍然让我无法级联的其他方式。 :( – 2009-07-14 16:04:16