我有一个拥有门的汽车实体。当汽车被删除时,门也应该被删除,因为它们本身没有意义。 这是 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 管理的文章:
关于nhibernate - 即使使用 AllDeleteOrphan,FluentNHibernate 也不会删除子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777844/