Fluent NHibernate — IndexOutOfRange

Я прочитал все сообщения и знаю, что 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: INSERT INTO Events (EventDate, Title) VALUES (@p0, @p1);@p0 = 21.05.2012 12:32: 23:00 [Тип: DateTime (0)], @p1 = 'Мое тестовое событие' [Тип: String (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, и это все еще вызывало то же исключение.

5
задан Carl Bussema 21 May 2012 в 19:53
поделиться