nhibernate - 即使使用 AllDeleteOrphan,FluentNHibernate 也不会删除子实体

标签 nhibernate fluent-nhibernate fluent-nhibernate-mapping all-delete-orphan

我有一个拥有门的汽车实体。当汽车被删除时,门也应该被删除,因为它们本身没有意义。 这是 FluentNHibernate 中的映射。

public class CarMap : ClassMap<Car>
{
    public CarMap()
    {
        Id(x => x.CarId).GeneratedBy.Assigned();
        HasMany(x => x.Doors).Cascade.AllDeleteOrphan();
    }
}

public class DoorMap : ClassMap<Door>
{
    public DoorMap()
    {
        Id(x => x.DoorId);
        References(x => x.Car);
    }   
}

CarDao 中的删除方法如下所示:

public void Delete(Car car)
{
    using (ISession session = NHibernateHelper.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        session.Delete(car);
        transaction.Commit();
    }
}

但是,当以这种方式删除汽车时,车门不会被删除,但 carId 会被置为 NULL。我认为 Cascade.AllDeleteOrphan() 会负责删除子项(门)。我必须将删除方法修改为:

public void Delete(Car car)
{
    using (ISession session = NHibernateHelper.OpenSession())
    using (ITransaction transaction = session.BeginTransaction())
    {
        var entity = session.Get<Car>(car.CarId);
        if (entity != null)
        {
            session.Delete(entity);
            transaction.Commit();
        }
    }
}

我觉得这里缺少一些东西,因为在删除对象之前必须获取它感觉不对。有什么想法吗?

最佳答案

您正在针对每个请求实例化和处置 session 。在您的第一个 Delete 方法中,实例化的 session 与最初加载您传入的 Car 对象的 session 不同。因此,它没有对 Door 对象的引用,以便在您请求删除 Car 时删除它们。

在第二种方法中, session 加载汽车,因此引用了子对象(即使子对象未完全加载,nHibernate 也会加载代理),这允许该 session 将删除级联到门对象当你删除汽车时。

根据您的应用程序, session 应该在更高级别上启动并在多个事务中使用。为每个事务创建和处置 session 是不必要的开销。

我建议您阅读以下有关 nHibernate 中 session 管理的文章:

http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

关于nhibernate - 即使使用 AllDeleteOrphan,FluentNHibernate 也不会删除子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777844/

相关文章:

nhibernate - 使用 Fluent NHibernate、Oracle 10g 和 OracleClientConfiguration.Oracle10 映射 clob

nhibernate - Fluent NHibernate 一对多关系设置外键为空

integration-testing - 这个 Fluent NHibernate 映射测试是误报吗?

nhibernate - 如何使用 NHibernate QueryOver 加入

c# - 使用 nHibernate 通过子集合限制 QueryOver

asp.net-mvc - Autofac,(流利)nHibernate,ISession "Session is closed!"间歇性

postgresql - 使用 Fluent NHibernate 和 PostgreSQL 时如何设置 FOREIGN KEY DEFERRABLE

nhibernate - 为同一个映射表切换数据库

c# - 流利的 NHibernate : Issue with many-to-many relationship with custom intermediary table

NHibernate 和 hilo 生成器 : how to design key-tables?