NHibernate在INSERT-单向多对一关系之后运行不必要的UPDATE命令



索赔品牌,我有一种单一的多对一关系。(一个索赔有一个与之相关的品牌)。

以下是工作良好的映射-

Claim.hbm.xml

<many-to-one name="Brand" class="Brand" column="BRAND_CODE" />

然而,当我保存索赔时,像这样-

var c = new Claim();
//Assign other properties to claim.
session.Get<Brand>(brandId);
c.Brand = brand;
session.SaveOrUpdate(c);

CLAIM表中执行插入命令后,nhibernate还会在BRAND表上运行不必要的更新命令。尽管在大多数情况下这可能不是问题,但我正在使用一个遗留数据库,该数据库具有BRAND表更新的触发器。我不希望这些触发器运行。

来自NHibernate的日志:

INSERT INTO JLL$SECSALES.SEC_STOCKIST_CLAIM_DET (ACTIVITY_CODE, COMP_CODE, COST_LEVEL1, COST_LEVEL2, FROM_DATE, TO_DATE, CLAIM_AMT, APPROVED_AMT, CLAIM_STATUS, REMARKS, VARIANCE, ACTIVITY_TYPE_ID, STOCKIST_CLAIM_ID_DET_ID, STOCKIST_CLAIM_ID) VALUES (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10, :p11, :p12, :p13);:p0 = 'ACT123' [Type: String (6)], :p1 = 'ACCDEP' [Type: String (6)], :p2 = 'DIV0000006' [Type: String (10)], :p3 = 'ABLE CHERIYAN K C ( E000005577 )' [Type: String (32)], :p4 = 01/28/2014 12:00:00 AM [Type: DateTime (0)], :p5 = 01/28/2014 12:00:00 AM [Type: DateTime (0)], :p6 = 0 [Type: Single (0)], :p7 = 0 [Type: Single (0)], :p8 = 'N' [Type: StringFixedLength (1)], :p9 = 'AAA' [Type: String (3)], :p10 = 0 [Type: Single (0)], :p11 = NULL [Type: Int64 (0)], :p12 = 1 [Type: Int64 (0)], :p13 = 12 [Type: Int64 (0)]
UPDATE JLL$TRAN.BRAND_MAST SET BRAND_DESC = :p0, REC_STATUS = :p1, ADDDATE = :p2, MODDATE = :p3, AUTHDATE = :p4, ADDUSER = :p5, MODUSER = :p6, AUTHUSER = :p7 WHERE BRAND_CODE = :p8;:p0 = 'BOXER' [Type: String (5)], :p1 = 'A' [Type: StringFixedLength (1)], :p2 = 12/28/2009 1:41:38 PM [Type: DateTime (0)], :p3 = 01/01/0001 12:00:00 AM [Type: DateTime (0)], :p4 = 12/28/2009 1:41:41 PM [Type: DateTime (0)], :p5 = 'PRADOSH' [Type: String (7)], :p6 = NULL [Type: String (0)], :p7 = 'PRADOSH' [Type: String (7)], :p8 = 'BND0000022' [Type: String (10)]

我在多对一关系上尝试过insert="false"update="false"cascade="none",但都是徒劳的。如何防止不必要的更新语句?

品牌是我们的应用程序永远不会改变的模式。它只用于具有多个表的多对一关系中。我只是从品牌模型中删除了品牌表中所有不必要列的映射,它就起了作用。我不明白为什么,但它起了作用!

我遇到了一个类似的问题,两个实体之间存在一对多关系。我用Inverse()标记了集合的末尾。每当我插入一个新的子实体时,NHibernate都会立即发布父实体的更新。由于其中一个字段的完整性问题,此更新被破坏。

我仔细查看了SQL和表,发现表中有大量字段的数值被标记为可为null,但表映射到的类中没有。问题是NHibernate尽职尽责地将零转换为零。因为字段现在实际上有一个值,在它为null之前,它将这些字段标记为脏字段,并有理由尝试更新数据库中的记录。解决方案是返回到类并将数字属性标记为可为null。一旦我完成了这个任务,我就重新编译了,并且在插入之后不再更新。

删除您的字段导致插入"消失",这表明这些字段出现了问题,可能与我的经历类似。

您需要在NH映射中设置袋子或集合元素的反向属性。

http://blog.lowendahl.net/data-access/managing-parentchild-relationships-with-nhibernate-inverse-management/

对类启用动态更新,以便只更新更改的属性。这将告诉您NHibernate检测到哪些属性脏,并允许您排除保存后属性更改的原因。

<class ... dynamic-update="true">