NHibernate 级联删除不适用于一对多关联

Posted

技术标签:

【中文标题】NHibernate 级联删除不适用于一对多关联【英文标题】:NHibernate Cascaded delete not working on one-to-many association 【发布时间】:2010-06-29 09:03:11 【问题描述】:

我正在尝试删除一个对象并将删除级联到一对多关联中的子对象。我认为我已经正确地完成了所有工作。但是,当我运行测试时,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:

插入运营商 (...) 值 (...);选择 last_insert_rowid();@p0 = 'WSH', @p1 = 759540, @p2 = False

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

SELECT carrier0_.Id, ... FROM Carriers carrier0_ WHERE carrier0_.Id=@p0;@p0 = 4 选择车辆0_.CarrierId 作为 CarrierId1_, ... FROM 车辆车辆0_ WHERE 车辆0_.CarrierId=@p0;@p0 = 4

更新车辆 SET CarrierId = null WHERE CarrierId = @p0;@p0 = 4

这是导致测试失败的粗体线,因为我对载体有非空约束(请参阅车辆映射)。

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

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

谢谢, 本

【问题讨论】:

在下面查看我的答案 - 一个错字是原因! 【参考方案1】:

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

所以基本上,如果你使用上面的映射,那么删除将级联(前提是你没有犯愚蠢的错别字:))

【讨论】:

以上是关于NHibernate 级联删除不适用于一对多关联的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的一对多自关联中的级联删除问题

Flask 学习-84.Flask-SQLAlchemy 一对多关系级联删除

Flask 学习-84.Flask-SQLAlchemy 一对多关系级联删除

Fluent NHibernate 仅级联删除关联记录

hibernate一对多单向关联时更新问题

关联映射级联操作关系维护 ---- Hibernate之一对多|多对一关系