2

ドアを持つ 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 は NULL に設定されます。私は、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();
        }
    }
}

オブジェクトを削除する前にオブジェクトを取得する必要があるとは思えないため、ここで何かが欠けているように感じます。何かご意見は?

4

1 に答える 1