0

複合キーを使用してレコードを挿入しようとしています (データベース設計ではなく、企業スキーマを使用する必要があるため、ここでは DB を変更することはできません)。

次のPOCOクラスがあります

public class RulesEngineHeader
{
    public virtual string CompanyCode { get; set; }
    public virtual string RuleID { get; set; }
    public virtual string RuleGroup { get; set; }
    public virtual string RuleDescription { get; set; }
    public virtual string Expression { get; set; }
}    

および次のマッピング (Fluent を使用)

internal class RulesEngineHeaderMap : ClassMap<RulesEngineHeader>
{
    internal RulesEngineHeaderMap()
    {
        Table("LIOEP023");

        Id(x => x.CompanyCode, "CONO23")
            .GeneratedBy.Assigned()
            .Length(2)
            .Not.Nullable();
        Id(x => x.RuleID, "RLID23")
            .GeneratedBy.Assigned()
            .Length(30)
            .Not.Nullable();
        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();
    }
}

次のコードを使用します。

using (iSeriesUOW uow = new iSeriesUOW())
{
    GenericRepository<RulesEngineHeader> rep = new GenericRepository<RulesEngineHeader>(uow);

    RulesEngineHeader header = new RulesEngineHeader();
    header.CompanyCode = "LI";
    header.RuleID = "TEST";
    header.RuleGroup = "AC";
    header.RuleDescription = "Description";
    header.Expression = "This is my rule expression";

    rep.Add(header);

    uow.Commit();
}

rep.Add は単純に

_uow.Session.Save(entityObject);

および uow.Commit(); _session.Flush(); を実行します。

if (_tx != null)
    _tx.Commit();

これを実行すると、実行しようとしている次のクエリが表示されます。

INSERT INTO LIOEP023
    (RGRP23,
    RLDS23,
    EXPR23,
    RLID23)
VALUES      ('AC' /* @p0_0 */,
    'Description' /* @p1_0 */,
    'This is my rule expression' /* @p2_0 */,
    'TEST' /* @p3_0 */)

ご覧のとおり、CompanyCode/CONO23 が見つからないため、エラーが発生しています。

これが私の挿入で使用されていない理由はありますか??

4

1 に答える 1

1

2 つの ID を使用する代わりに、CompositeId を使用する必要があることがわかりました。

したがって、私のコードは次のようになります。

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();
}
于 2012-09-25T17:15:54.117 に答える