我正在尝试通过创建新对象向数据库添加新记录:
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:“索引超出范围。必须为非负数且小于集合的大小。参数名称:索引”
据我了解,错误是由于复杂的映射而发生的:
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 表,具体取决于级别值(4 或 5)。 选择效果完美。 但是当我尝试 SaveOrUpdate 时出现上述错误。
还有小纸条。没有下一个属性:
.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);
和Map(x => x.LevelId, "Id");
ReferenceAny
我建议删除 Map(x => x.Level);
和 Map(x => x.LevelId, "Id");
因为它们是与 KeyProperties 重复
注意:
.Not.Insert().Not.Update()
与.ReadOnly()
是多余的,后者是前者的快捷方式
关于c# - 流畅的 NHibernate : Index was out of range exception with ReferencesAny mapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16839962/