我正在尝试删除一个对象,并将删除级联到一对多关联中的子对象。我认为我已经正确地完成了所有工作。但是,当我运行测试时,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插入到列中。
那么我需要做些什么来确保删除运营商,删除所有车辆?
谢谢, 本
答案 0 :(得分:0)
毕竟,问题最终成为父对象上定义的其他一个集合中的拼写错误。只是通过尝试一些更具体的测试,我发现我试图将一个集合转换为错误的类型 - doh!
所以基本上,如果你使用上面的映射,那么删除将级联(假设你不做愚蠢的拼写错误:))