我已经阅读了所有帖子并且知道 IndexOutOfRange 通常会发生,因为一个列被引用了两次。但是根据我的映射,我看不出这是如何发生的。在配置中使用 SHOW_SQL 为 true 时,我看到一个 Insert 到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,标题)值(@p0,@p1);@p0 = 5/21/2012 12:32:11 PM [类型:日期时间(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 不会处于双向关系,从我读过的内容来看)。Event
FWIW我还通过删除from尝试将其作为单向关系RadioButtonQuestion
,但仍然导致相同的异常。