【问题标题】:FluentNHibernate not deleting child entity even with AllDeleteOrphan即使使用 AllDeleteOrphan,FluentNHibernate 也不会删除子实体
【发布时间】:2013-05-27 17:21:20
【问题描述】:

我有一个拥有门的 Car 实体。当汽车被删除时,门也应该被删除,因为它们本身没有意义。 这是 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 中的 Delete 方法如下所示:

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

但是,以这种方式删除汽车时,不会删除车门,而是将 carId 设为 de NULL。我认为 Cascade.AllDeleteOrphan() 会负责删除孩子(门)。我不得不修改 Delete 方法:

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

我觉得我在这里遗漏了一些东西,因为在删除它之前必须获取一个对象是不对的。有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    我建议您阅读以下有关 nHibernate 中的会话管理的帖子:

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

    【讨论】:

    • 正确。在此处查看最后一段:nhforge.org/doc/nh/en/index.html#example-parentchild-cascades注意:即使集合映射指定 inverse="true",级联仍然通过迭代集合元素来处理。所以如果你要求一个对象被级联保存、删除或更新,你必须将它添加到集合中。仅仅设置其父级是不够的。
    • @pobed2 这能回答你的问题吗?
    • 绝对是的。我想我误解了一些关于 NHibernate 的概念,你把我引向了正确的方向。谢谢!
    • 好东西! - 你遇到的任何其他事情都告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多