【发布时间】:2015-08-20 01:33:57
【问题描述】:
我正在努力解决一个与 NHibernate 相关的问题,我可以在其中使用一些输入。
简介:
我有一个遗留数据库,其中关系概念尚未真正应用。
在数据库中,我有一个 OrderLine 表,其中包含订单行的数据。
除此之外,该表还包含具有Order 特定信息的所有列。例如,这可能是客户的订单号。
例如如果我有 10 个订单行 - 那么我的 OrderLines 表中有 10 行,每行都有所有 Order 特定数据,例如订单号或客户信息。
我不想在我的代码中包含上述结构,因此为 Orders 创建了一个视图,以便我可以在 NHibernate 中映射我的 Order,然后它有一个 OrderLines 的集合/包,这使得更多感觉。
映射:(简化)
<class name="Order" table="[view_Orders]">
<bag name="OrderLines">
</class>
<class name="OrderLine" table="OrderLines" />
问题:
视图的复杂性使得无法保存到视图中。尝试 NHibernates 时会抛出此异常:
NHibernate.Exceptions.GenericADOException:无法插入:XXX ---> System.Data.SqlClient.SqlException:视图或函数“view_Orders”不可更新,因为修改会影响多个基表。
我的 NHibernate 映射构造为一个 Order 对象,该对象具有 OrderLine 对象的“集合或包”。理想情况下,我希望 NHibernate 只保留 OrderLine 对象集而不是整个对象。
有没有办法做到这一点?我曾尝试使用不同的锁定模式锁定对象,但对我没有帮助。
【问题讨论】:
-
看来您正在尝试做的事情应该可行。异常表明 NHibernate 正在尝试对映射到不可更新视图的 Order 实体执行 UPDATE。 NHibernate 只会在它认为实体是脏的时才会这样做,在 OrderLines 集合之外。您应该检查您的其他映射属性。或许可以尝试使用像 NHProf 这样的分析器来查看发生了什么变化。
-
没错。我不想更新我的订单,因为它映射到不可更新的视图。相反,我只想更新子对象,即 OrderLines 包。我一直在使用 NHProfiler,上面的异常基本上是通过 NHibernate 传递的 SQL 异常。
标签: nhibernate nhibernate-mapping