【问题标题】:Fluent NHibernate attempting to delete collection with bi-directional referenceFluent NHibernate 尝试使用双向引用删除集合
【发布时间】:2012-07-04 18:27:42
【问题描述】:

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

NHib 引发“无法删除集合”错误 - 这是因为它试图从 OrderLineDTO 子项中删除“订单”引用吗?

编辑:

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

编辑 2:

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    想通了 - RTFM :P

    在手册中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多