流畅的NHibernate尝试使用双向引用删除集合

时间:2012-07-04 09:07:27

标签: c# sql-server nhibernate fluent-nhibernate

我正在使用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到订单的FK,OrderLine.OrderId = Order.OrderId,没有级联。另外我不明白为什么收藏需要删除..

NHib抛出'无法删除集合'错误 - 这是因为它试图从OrderLineDTO子项中删除'Order'引用吗?

编辑:

实际上看看DTO,从我的业务对象的反向映射看起来,每个OrderLineDTO都没有包含'Order',所以我可能已经解决了这个问题!当我这样做时讨厌它:)

编辑2:

事实证明,即使在服务器端正确地重新创建对象,我也会遇到同样的问题

任何想法?

1 个答案:

答案 0 :(得分:3)

想出来 - RTFM:P

在手册中:

非常重要注意:如果关联的列声明为NOT NULL,则NHibernate在创建或更新关联时可能会导致约束违规。要防止出现此问题,必须使用标记为inverse =“true”的多值结束(集合或包)的双向关联。请参阅本章后面的双向关联讨论。