Я пытаюсь добавить новую запись в базу данных с помощью создания нового объекта:Fluent NHibernate: Индекс находился вне диапазона исключения с отображением ReferencesAny
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 брошен после transaction.Commit() : «Индекс находился вне диапазона Должно быть неотрицательным и меньше, чем размер коллекции имя параметра:.. Индекс»
ошибка, как я понимаю, происходит из-за сложного отображения:
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.
Что я делаю неправильно?
являются level4 и Level5 на одной и той же таблицы? – Firo
Level4 и Level5 - разные таблицы. Но в зависимости от поля Level в таблице TableHours может существовать объект типа Level4 или level5. – Ksice