3

次のマッピング コードを検討してください。

public sealed class BankMapping : ClassMap<Bank>
{
    public BankMapping()
    {
        CompositeId()
            .KeyProperty(x => x.SerialNumber, "SerialBankRef")
            .KeyProperty(x => x.FinancialPeriodId, "FinancialPeriodRef");
        Map(x => x.Code);
        Map(x => x.Title);
        Map(x => x.Comment);
        Map(x => x.IsActive);            
        HasMany(x => x.BankBranchs).KeyColumns.Add(new[] { "SerialBankRef", "FinancialPeriodRef" });

    }
}

BankBranchマッピングコードは次のとおりです。

public sealed class BankBranchMapping : ClassMap<BankBranch>
{
    public BankBranchMapping()
    {
       CompositeId()
            .KeyProperty(x => x.FinancialPeriodId, "FinancialPeriodRef")
            .KeyProperty(x => x.SerialNumber, "SerialNumber");
        Map(x => x.Code);
        Map(x => x.Title);
        Map(x => x.Comment);
        Map(x => x.IsActive);
        Map(x => x.Address);
        Map(x => x.Fax);
        Map(x => x.Telephone);
        References(x => x.Bank).Columns(new[] { "SerialBankRef", "FinancialPeriodRef" });
    }
}

ご覧のとおり、FinancialPeriodRefフィールドはマッピングで外部キーおよび複合キーの一部として機能し、NHibernate は DB を正しく構築し、テーブルBankBranchにレコードを挿入しようとするまではすべて問題ないようです。BankBranch

フィールド ( ) を FK と PK として 2 回System.IndexOutOfRangeException : Invalid index 10 for this SqlParameterCollection with Count=10.マップしたことを示すエラーが表示され、問題の解決方法がわかりません。FinancialPeriodRef

fromと完全に等しい間、主キーFinancialPeriodRefのasが必要です。BankBranchFinancialPeriodRefBank

一意の制約を確立するためにこのフィールドが必要であり、複合キーの利点も不可欠です。

4

1 に答える 1

5

複合外部キーを記述するには、KeyProperty ではなく KeyReference を使用する必要があります。

public BankBranchMapping()
{
    CompositeId()
        .KeyReference(x => x.FinancialPeriodId, "FinancialPeriodRef")
        .KeyReference(x => x.SerialNumber, "SerialNumber");
    ...
}

私はあなたとまったく同じ問題を抱えていて、1時間ほど後にこの投稿に出くわしました: https://stackoverflow.com/a/7997225/569662それは私を正しく指摘しました。

于 2014-08-14T08:47:44.147 に答える