NHibernate Cascaded删除不能处理一对多关联

时间:2010-06-29 09:03:11

标签: nhibernate nhibernate-mapping

我正在尝试删除一个对象,并将删除级联到一对多关联中的子对象。我认为我已经正确地完成了所有工作。但是,当我运行测试时,NHibernate会尝试将空值插入子表的外键列,而不是删除项。

从我的父映射(运营商):

<set name="Drivers" access="field.camelcase-underscore">
  <key column="CarrierId"/>
  <one-to-many class="Vehicle"/>
</set>

从我的孩子映射(车辆):

    <many-to-one name="Carrier" class="Carrier" column="CarrierId" not-null="true"/>

我的测试:

    [Test]
    public void Can_delete_a_carrier_and_associated_vehicles() {
        object id;

        var carrier = new Carrier { BusinessRef = 759540, Name = "Carrier1" };
        var vehicle = new Vehicle { Carrier = carrier, BusinessRef = "FOOBAR", VehicleType = VehicleType.Trailer };

        using (var txn = session.BeginTransaction()) {
            id = session.Save(carrier);
            session.Save(vehicle);
            txn.Commit();
        }

        session.Clear();

        using (var txn = session.BeginTransaction()) {
            var fromDb = session.Get<Carrier>(id);
            Assert.IsNotNull(fromDb);
            Assert.AreEqual("FOOBAR", fromDb.Vehicles.First().BusinessRef);

            session.Delete(fromDb);
            txn.Commit();
        }
    }

生成的SQL:

插入承运人(......)价值观(......); select last_insert_rowid(); @ p0 ='WSH',@ p1 = 759540,@ p2 = False

插入车辆(......)价值观(......); select last_insert_rowid(); @ p0 = 2,@ p1 ='FOOBAR',@ p2 = 4

SELECT carrier0_.Id,... FROM Carriers carrier0_ WHERE carrier0_.Id=@p0; @ p0 = 4 SELECT vehicles0_.CarrierId as CarrierId1_,... FROM Vehicles vehicles0_ WHERE vehicles0_.CarrierId=@p0; @ p0 = 4

UPDATE Vehicles SET CarrierId = null WHERE CarrierId = @ p0; @ p0 = 4

这是以粗体显示导致测试失败的行,因为我对载体有一个非空约束(参见车辆映射)。

这是我不明白的,如果我有一个非空约束,为什么NHibernate尝试将null插入到列中。

那么我需要做些什么来确保删除运营商,删除所有车辆?

谢谢, 本

1 个答案:

答案 0 :(得分:0)

毕竟,问题最终成为父对象上定义的其他一个集合中的拼写错误。只是通过尝试一些更具体的测试,我发现我试图将一个集合转换为错误的类型 - doh!

所以基本上,如果你使用上面的映射,那么删除将级联(假设你不做愚蠢的拼写错误:))