2

新しいオブジェクトを作成して、データベースに新しいレコードを追加しようとしています:

using (var session = conn.OpenNewSession())
{
 using (var tran = session.BeginTransaction())
 {
  TableHours hours = new TableHours(periodId, level, levelId.ToString(), levelTblRef);
  hours.WorkHours = 10;
  session.SaveOrUpdate(hours);
  tran.Commit(); //Exception thrown here
 }
}

transaction.Commit() の後に System.ArgumentOutOfRangeException がスローされます:「インデックスが範囲外でした。負でなく、コレクションのサイズよりも小さい必要があります。パラメータ名: index」

私が理解しているエラーは、複雑なマッピングが原因で発生します。

public class TableHours
{
public virtual int SaleMonthId { get; protected set; }
public virtual int Level { get; protected set; }
public virtual string LevelId { get; protected set; }
public virtual Level Lvl { get; protected set; }
public virtual decimal WorkHours { get; set; }
//..other methods
public TableHours(int saleMonthId, int level, string levelId, Level lvl)
{
            this.SaleMonthId = saleMonthId;
            this.Level = level;
            this.LevelId = levelId;
            this.Lvl = lvl;
}
}

そしてマッピング:

public class TableHoursMap : ClassMap<TableHours>
{
    public TableHoursMap()
    {
        Table("TableHours");

        CompositeId()
            .KeyProperty(x => x.SaleMonthId)
            .KeyProperty(x => x.Level)
            .KeyProperty(x => x.LevelId, "Id");

        Map(x => x.SaleMonthId);

        Map(x => x.Level);

        Map(x => x.LevelId, "Id");

        Map(x => x.WorkHours);

        ReferencesAny(x => x.Lvl)
            .IdentityType<string>()
            .EntityTypeColumn("Level")
            .EntityIdentifierColumn("Id")
            .AddMetaValue<Level5>("5")
            .AddMetaValue<Level4>("4")
            .Not.Insert()
            .Not.Update()
            .Cascade.None()
            .ReadOnly();
}
}

つまり、Level 値 (4 または 5) に応じて、Level4 または Level5 テーブルへの Lvl フィールド参照。選択は完璧に機能します。しかし、SaveOrUpdate を実行しようとすると、上記のエラーが発生します。

そして小さなメモ。次の属性なし:

.Not.Insert()
.Not.Update()
.Cascade.None()
.ReadOnly();

Lvl フィールドを参照したインデックス範囲外エラーが発生しました。だから私はこれが責任者だと思います。

Level4 および Level5 クラスは Level クラスを継承します。

私は何を間違っていますか?

4

1 に答える 1