FluentNHibernate即使使用AllDeleteOrphan也不删除子实体
我有一个拥有车门的汽车实体。当汽车被删除时,门也应该被删除,因为它们本身没有意义。 这是FluentNHibernate中的映射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();
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();
}
}
}