c# - 流畅的 NHibernate : Index was out of range exception with ReferencesAny mapping

标签 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.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 类。

我做错了什么?

最佳答案

IdLevel映射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/

相关文章:

c# - 检查数据表中是否存在值?

security - nHibernate,我可以告诉它 Fetch<T>,但我可以告诉它 Stay<T> 吗?

NHibernate.Validator : when saving entity, 我的自定义消息不可用,如何获取它们?

c# - Fluent Nhibernate、复合键无法解析属性 : error message

c# - 在 Windows 服务和 Azure WebJob 之间利用单一代码库的方法

c# - 如何在 Windows 10 中打开显示设置(语法上,特别是使用 C#)?

c# - 将 PDF 中的外部链接转换为链接到 iTextSharp 中的嵌入式附件

c# - 发送 HTTP header 后,Windows Auth Server 无法设置状态

NHibernate 返回重复行

映射抽象类和子类时NHibernate DuplicateMappingException