2010-06-29 101 views
0

我想删除一个对象,并级联删除到一对多关联的子对象。我认为,我已经做了一切正确的工作。但是,当我运行我的测试时,NHibernate尝试将空值插入到子表的外键列中,而不是删除项目。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:

INSERT INTO Carrier s(...)VALUES(...);选择last_insert_rowid(); @ p0 ='WSH',@ p1 = 759540,@ p2 = False

INSERT INTO车辆(...)VALUES(...);选择last_insert_rowid(); @ P0 = 2,@ P1 = 'FOOBAR',@ P2 = 4

SELECT carrier0_.Id,... FROM载体carrier0_ WHERE [email protected]; @ P0 = 4 SELECT vehicles0_.CarrierId如CarrierId1_,... FROM车辆vehicles0_ WHERE [email protected]; @ P0 = 4

UPDATE SET车辆= CarrierId空WHERE CarrierId = @ P0; P0 @ = 4

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

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

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

感谢, 本

+0

看到我的回答如下 - 一个错字是原因! – 2010-06-29 11:36:02

回答

0

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

所以基本上,如果你使用上面的映射,则删除会级联(提供你不傻错别字:))