我正在使用 Fluent 为我正在做的框架演示映射父集合 -> 子集合场景,我是一个 NHibernate 新手,所以放轻松:)
我的 DTO 有以下映射:
public class OrderMapping : ClassMap<OrderDTO>
{
public OrderMapping()
{
Id(x => x.OrderId);
Map(x => x.OrderDate);
Map(x => x.Address);
HasMany<OrderLineDTO>(x => x.OrderLines).KeyColumn("OrderId").Not.LazyLoad();
Table("`Order`");
}
}
和
public class OrderLineMapping : ClassMap<OrderLineDTO>
{
public OrderLineMapping()
{
Id(x => x.OrderLineId);
Map(x => x.OrderId).ReadOnly();
Map(x => x.Amount);
Map(x => x.Description);
References<OrderDTO>(x => x.Order).Column("OrderId");
Table("OrderLine");
}
}
DTO 对象被设置为接收这些值,这一切都很好(我现在已经为孩子关闭了 LazyLoad,因为我正在处理框架并且 LazyLoading 还没有完成)。
所以我打开我的测试应用程序 - 数据被加载到两个网格中,父项和子项正确显示
如果我对子对象或父对象进行更改并尝试保存,我可以看到为父/子保存生成的 SQL 是正确的,并且传递给 SQL 的值是正确的 - 唯一的问题是更新后, NHib 决定要删除该集合?它尝试这个 SQL:
UPDATE OrderLine SET OrderId = null WHERE OrderId = 2
失败是因为该表在 OrderLine.OrderId = Order.OrderId 上具有从 OrderLine 到 Order 的 FK,没有级联。另外我不明白为什么集合需要删除..
NHib 抛出“无法删除集合”错误 - 这是因为它试图从 OrderLineDTO 子项中删除“订单”引用吗?
编辑:
实际上查看 DTO,在我的业务对象的反向映射中,每个 OrderLineDTO 中不包含“订单”,所以我可能已经解决了这个问题!当我这样做时讨厌它:)
编辑2:
事实证明,即使在服务器端正确地重新创建对象,我也会遇到同样的问题
有任何想法吗?