【发布时间】: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 会尝试将空插入列中。
那么我需要做些什么来确保删除运营商,删除所有车辆?
谢谢, 本
【问题讨论】:
-
在下面查看我的答案 - 一个错字是原因!
标签: nhibernate nhibernate-mapping