我读过所有的职位,并知道IndexOutOfRange通常是因为一列正在引用了两次。 但是,我没有看到,是如何根据我的映射发生。 随着SHOW_SQL在配置真的,我看到一个插入到Events
表,然后一个IndexOutOfRangeException
是指RadioButtonQuestions
表。 我看不到它试图使用产生异常的SQL。 我尝试使用自动映射,现在已切换到全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活动(EVENTDATE,标题)VALUES(@ P0,P1 @)@ P0 = 2012/5/21下午十二时32分11秒[类型:日期时间(0)],@ P1 = '我的测试事件' [类型:String(0)]的NHibernate:选择@@ IDENTITY
Events.Tests.Events.Tasks.EventTasksTests.CanCreateEvent:NHibernate.PropertyValueException:用于Events.Domain.RadioButtonQuestion._Events.Domain.Event.RadioButtonQuestionsIndexBackref错误脱水属性值----> System.IndexOutOfRangeException:与ParameterIndex '3' 的SqlCeParameter不受此SqlCeParameterCollection遏制。
因此,如果真的栏被引用了两次,什么是我的FNH的配置是造成这种行为的问题? 我(一个事件有许多单选按钮的问题)在订购努力了双向的关系(我会保持它,因为NH不会在一个双向的关系,从我读过)。 FWIW我也试过这是一个单向的关系,通过移除Event
从RadioButtonQuestion
,它仍然造成了同样的异常。