FluentNHibernate即使使用AllDeleteOrphan也不删除子实体

FluentNHibernate即使使用AllDeleteOrphan也不删除子实体,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,all-delete-orphan,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();

我有一个拥有车门的汽车实体。当汽车被删除时,门也应该被删除,因为它们本身没有意义。 这是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);
    }   
}
但是,以这种方式删除汽车时,不会删除车门,但carId会被置为非空。我认为Cascade.AllDeleteOrphan()将负责删除子项(Doors)。我不得不将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();
        }
    }
}
公共作废删除(汽车)
{
使用(ISession session=NHibernateHelper.OpenSession())
使用(ITransaction transaction=session.BeginTransaction())
{
var entity=session.Get(car.CarId);
如果(实体!=null)
{
删除(实体);
Commit();
}
}
}

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

您正在根据每个请求实例化和处理会话。在第一个Delete方法中,实例化的会话与最初加载您要传递的Car对象的会话不同。因此,当您请求删除汽车时,它不会引用车门对象来删除它们

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

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

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


正确。检查此处的最后一段:。注意:即使集合映射指定inverse=“true”,级联仍然通过迭代集合元素进行处理。因此,如果需要通过级联来保存、删除或更新对象,则必须将其添加到集合中。仅仅设置它的父对象是不够的。@pobed2这能回答您的问题吗?当然可以。我想我误解了关于NHibernate的一些概念,你引导我走上了正确的方向。谢谢好东西如果您遇到其他任何问题,请告诉我。
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();
        }
    }
}