C# Fluent NHibernate:索引超出范围引用任何映射异常

C# Fluent NHibernate:索引超出范围引用任何映射异常,c#,fluent-nhibernate,C#,Fluent Nhibernate,我正在尝试通过创建新对象向数据库添加新记录: using (var session = conn.OpenNewSession()) { using (var tran = session.BeginTransaction()) { TableHours hours = new TableHours(periodId, level, levelId.ToString(), levelTblRef); hours.WorkHours = 10; session.SaveOrUpda

我正在尝试通过创建新对象向数据库添加新记录:

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
 }
}
System.ArgumentOutOfRangeException在事务后引发。提交():“索引超出范围。必须为非负且小于集合的大小。参数名称:索引”

据我所知,发生错误的原因是映射复杂:

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();
}
}
我的索引超出了Lvl字段引用的范围错误。这就是为什么我猜是这个人在责怪我

Level4和Level5类继承自Level类


我做错了什么?

Id
Level
映射了3次:

  • .KeyProperty(x=>x.Level)
    .KeyProperty(x=>x.LevelId,“Id”)
  • Map(x=>x.Level)
    映射(x=>x.LevelId,“Id”)
  • ReferenceAny
我建议删除
Map(x=>x.Level)
映射(x=>x.LevelId,“Id”)因为它们与KeyProperties重复

注:

  • .Not.Insert().Not.Update()
    对于
    .ReadOnly()
    是多余的,后者是前者的快捷方式

级别4和级别5是否在同一张表上?级别4和级别5-不同的表。但根据TableHours表中的级别字段,可能存在Level4或level5类型的对象。请注意,该级别和LevelId-是不同的字段。ReferenceAny是Lvl的映射,它也是与Level或levelidies不同的对象,但是
.KeyProperty(x=>x.Level)
Map(x=>x.Level)
是两次映射的同一列,这会导致错误。另外
TableHours.LevelId
TableHours.Lvl.Id
也是一样的,如果我知道如何在compositeId中映射referenceAny,我会删除
TableHours.LevelId
。我删除了映射,除了compositeId和referenceAny,现在它工作了!谢谢!
.Not.Insert()
.Not.Update()
.Cascade.None()
.ReadOnly();