我从声明到品牌之间存在无关紧要的多对一关系。 (一个声明有一个与之相关的品牌)。
以下是映射,工作正常 -
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"
,但徒劳无功。如何防止不必要的更新语句?
答案 0 :(得分:1)
您需要在NH映射中设置bag或set元素的inverse属性。
答案 1 :(得分:1)
品牌是我们的应用永远不会改变的模型。它仅用于与多个表的多对一关系。我刚刚从Brand模型中删除了品牌表中所有不必要列的映射,并且它有效。我不明白为什么,但它有效!
我遇到了类似的问题,两个实体之间存在一对多的关系。我的收集端标有Inverse()。每当我插入一个新的子实体时,NHibernate会立即为父实体发布更新。由于其中一个字段存在完整性问题,此更新随后爆炸。
我仔细研究了SQL和表,然后认识到有大量字段的数值在表中被标记为可为空,但不在表映射到的类中。问题是NHibernate尽职尽责地将空值转换为零。因为该字段实际上具有一个值,它现在在null之前,它将这些字段标记为脏,并且有理由尝试更新数据库中的记录。解决方案是返回到类并将数字属性标记为可为空。完成此任务后,我重新编译,插入后不再更新。
移除你的字段导致插入消失的事实&#34;表示这些字段有问题,可能与我的经历类似。
答案 2 :(得分:0)
在类上启用动态更新,以便仅更新已更改的属性。这将告诉您NHibernate检测到哪些属性为脏,并且应该允许您解决保存后属性更改的原因。
<class ... dynamic-update="true">