2010-06-29 161 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!

所以基本上,如果你使用上面的映射,則刪除會級聯(提供你不傻錯別字:))