0

除了给定以下类和流利的地图的其他问题之外,有没有办法在删除相关人员时自动级联删除 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 );
        }
}
4

2 回答 2

0

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

您实际需要做的是获取包含该人的所有驾驶执照,然后使用 Cascade delete 删除 DriverLicenses,这将删除人员记录和执照。

(我最近没有关注 FNH 堆栈上的很多更改,因此它可能在某个时候被重命名)您需要将地图更改为类似于:

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

编辑:添加新信息后,您实际需要做的是在您的存储库类中进行设置,您可以在其中处理删除一个人以运行搜索具有该人的所有驾驶执照。您很可能需要编写一个 Criteria 表达式来处理它。

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

在您解释的情况下,不希望以您希望的方式限制孤立数据并且不希望在人员类中拥有驾驶执照类,因此无法处理任何类型的级联删除(据我所知)。

于 2009-07-14T13:10:04.997 回答
-1

由于出于业务原因,您无法从 DriversLicense 级联删除到 Person,而且您真的不知道 Person 对 DriversLicense 有什么了解,并且您有充分的理由满足此要求,那么我认为您可以通过以下方式处理它两种方式:

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

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

于 2009-07-17T21:43:33.057 回答