1

次の2つのマッピングがあります。

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 つのキー フィールドすべてを使用しています。代わりにここで挿入を行う必要がありますが、上記の選択でレコードが見つかったため、更新を行う必要があると考えられ、0 レコードが返されます。

ここで私が間違っていることはありますか?

4

1 に答える 1

1

RuleVariable に複合キーを使用しています。NHibernate には、RuleVariable が新しいインスタンスか既存のインスタンスかを知る方法がありません。ID のような生成された ID を使用した場合、ID が > 0 であるかどうかを確認することで判断できます。

新しい RuleVariable が新しいインスタンスであることを NHibernate に伝える必要があります。ヘッダーを保存する前に RuleVariable を永続化する必要があります。そのためには、session.Save(variable) を呼び出します。

于 2012-09-26T08:52:48.547 に答える