2012-09-25 49 views
1
工作

我有以下2个映射:更新这个记录不是与NHibernate

internal RulesEngineHeaderMap() 
{ 
    Table("LIOEP023"); 

    CompositeId() 
     .KeyProperty(x => x.CompanyCode, "CONO23") 
     .KeyProperty(x => x.RuleID, "RLID23"); 
    Map(x => x.RuleGroup, "RGRP23") 
     .Length(30) 
     .Not.Nullable(); 
    Map(x => x.RuleDescription, "RLDS23") 
     .Length(50) 
     .Not.Nullable(); 
    Map(x => x.Expression, "EXPR23") 
     .Length(2500) 
     .Not.Nullable(); 
    HasMany(x => x.RuleVariables) 
     .KeyColumns.Add("CONO24", "RLID24"); 
} 

internal RulesEngineVariableDetailMap() 
{ 
    Table("LIOEP024"); 
    CompositeId() 
     .KeyProperty(x => x.CompanyCode, "CONO24") 
     .KeyProperty(x => x.RuleID, "RLID24") 
     .KeyProperty(x => x.Name, "RVAR24"); 
    Map(x => x.Type, "VTYP24") 
     .Not.Nullable(); 
    Map(x => x.Description, "VDES24") 
     .Not.Nullable(); 
    Map(x => x.Required, "RMAN24") 
     .Not.Nullable(); 
    References(x => x.RuleHeader) 
     .Columns("CONO24", "RLID24") 
     .NotFound.Ignore() 
     .Nullable(); 
} 

当我尝试添加一个新的对象为RulesEngineHeader和更新的RuleVariables的IList ,我得到的错误

Batch update returned unexpected row count from update; 
    actual row count: 0; expected: 1 

当我看着我的SQL,我看到的是:

SELECT rulevariab0_.CONO24 as CONO1_1_, 
    rulevariab0_.RLID24 as RLID2_1_, 
    rulevariab0_.RVAR24 as RVAR3_1_, 
    rulevariab0_.CONO24 as CONO1_1_0_, 
    rulevariab0_.RLID24 as RLID2_1_0_, 
    rulevariab0_.RVAR24 as RVAR3_1_0_, 
    rulevariab0_.VTYP24 as VTYP4_1_0_, 
    rulevariab0_.VDES24 as VDES5_1_0_, 
    rulevariab0_.RMAN24 as RMAN6_1_0_ 
FROM LIOEP024 rulevariab0_ 
WHERE rulevariab0_.CONO24 = 'LO' /* @p0 */  <-- KEY FIELD 
    and rulevariab0_.RLID24 = 'Test' /* @p1 */ <-- KEY FIELD 

where子句仅包含我定义的3个关键领域的2,所以它的查找记录,并试图更新,但随后的更新如下:

UPDATE LIOEP024 
SET CONO24 = 'LO' /* @p0_0 */, 
    RLID24 = 'Test' /* @p1_0 */ 
WHERE CONO24 = 'LO' /* @p2_0 */   <-- KEY FIELD 
    AND RLID24 = 'Test' /* @p3_0 */  <-- KEY FIELD 
    AND RVAR24 = 'Some Name' /* @p4_0 */ <-- KEY FIELD 

正如你所看到的,它使用全部3个关键字段。它应该在这里做一个插入,但是由于上面的select找到了该记录,它认为它应该执行更新,它将返回0条记录。

任何想法我在做什么错在这里?

回答

1

您正在使用RuleVariable的组合键。 NHibernate无法知道您的RuleVariable是新实例还是现有实例。如果您使用生成的身份标识,那么可以通过检查ID是否大于0.

您需要告诉NHibernate您的新RuleVariable是一个新实例,即。您需要在保存报头之前坚持RuleVariable,为此,请调用session.Save(变量)

相关问题