Я прочитал все сообщения и знаю, что IndexOutOfRange обычно происходит, потому что на столбец ссылаются дважды. Но я не понимаю, как это происходит, основываясь на моих сопоставлениях. Если в конфигурации SHOW_SQL установлено значение true, я вижу вставку в таблицу Events
, а затем IndexOutOfRangeException
, которая ссылается на таблицу RadioButtonQuestions
. Я не вижу SQL, который он пытается использовать, который генерирует исключение. Я попытался использовать AutoMapping и теперь переключился на полное ClassMap
для этих двух классов, чтобы попытаться сузить проблему.
public class RadioButtonQuestion : Entity
{
[Required]
public virtual Event Event { get; protected internal set; }
[Required]
public virtual string GroupIntroText { get; set; }
}
public class Event : Entity
{
[Required]
public virtual string Title { get; set; }
[Required]
public virtual DateTime EventDate { get; set; }
public virtual IList<RadioButtonQuestions> RadioButtonQuestions { get; protected internal set; }
}
public class RadioButtonQuestionMap : ClassMap<RadioButtonQuestion>
{
public RadioButtonQuestionMap()
{
Table("RadioButtonQuestions");
Id(x => x.Id).Column("RadioButtonQuestionId").GeneratedBy.Identity();
Map(x => x.GroupIntroText);
References(x => x.Event).Not.Nullable();
}
}
public class EventMap : ClassMap<Event>
{
public EventMap()
{
Id(x => x.Id).Column("EventId").GeneratedBy.Identity();
Map(x => x.EventDate);
Map(x => x.Title);
HasMany(x => x.RadioButtonQuestions).AsList(x => x.Column("ListIndex")).KeyColumn("EventId").Not.Inverse().Cascade.AllDeleteOrphan().Not.KeyNullable();
}
}
Сгенерированный SQL выглядит правильно:
create table Events (
EventId INT IDENTITY NOT NULL,
EventDate DATETIME not null,
Title NVARCHAR(255) not null,
primary key (EventId)
)
create table RadioButtonQuestions (
RadioButtonQuestionId INT IDENTITY NOT NULL,
GroupIntroText NVARCHAR(255) not null,
EventId INT not null,
ListIndex INT null,
primary key (RadioButtonQuestionId)
)
Это использует NH 3.3.0.4000 и FNH 1.3.0.727. Когда я пытаюсь сохранить новое событие (с прикрепленным RadioButtonQuestion), я вижу
NHibernate: ВСТАВИТЬ В события (EventDate, Title) VALUES (@p0, @p1); @p0 = 21.05.2012 12:32:11 [Тип: DateTime (0)], @p1 = 'Мое тестовое событие' [Тип: строка (0)] NHibernate: выберите @@IDENTITY
Events.Tests.Events.Tasks.EventTasksTests.CanCreateEvent: NHibernate.PropertyValueException : Ошибка обезвоживания значения свойства для Events.Domain.RadioButtonQuestion._Events.Domain.Event.RadioButtonQuestionsIndexBackref ----> System.IndexOutOfRangeException : SqlCeParameter с ParameterIndex '3' не содержится в этой коллекции SqlCeParameterCollection.
Итак, если на столбец действительно ссылаются дважды, в чем проблема с моей конфигурацией FNH, которая вызывает такое поведение? Я пытаюсь установить двунаправленные отношения (у одного события есть много вопросов по радиокнопкам) с упорядочением (я буду поддерживать его, поскольку NH не будет в двунаправленных отношениях, насколько я читал). FWIW Я также попробовал это как однонаправленную связь, удалив Event
из RadioButtonQuestion
, и это все равно вызвало то же исключение.