我讀過所有的帖子,並知道IndexOutOfRange通常發生,因爲列被引用兩次。但是我根據我的映射看不到這是怎麼回事。在配置中SHOW_SQL爲true,我看到Events
表中的插入,然後引用RadioButtonQuestions
表。我看不到它正在嘗試使用的SQL生成異常。我嘗試使用AutoMapping,現在已經切換到完整ClassMap
這兩個類來嘗試縮小問題範圍。流利NHibernate的 - IndexOutOfRange
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,Title)VALUES(@ p0,@ p1); @ p0 = 2012/5/21 12:32 :11 PM [類型:日期時間(0)],@ P1 = '我的測試事件'[類型:String(0)] NHibernate的:選擇@@ IDENTITY
Events.Tests.Events.Tasks.EventTasksTests.CanCreateEvent : NHibernate.PropertyValueException:ErrorDefault屬性值的Events.Domain.RadioButtonQuestion._Events.Domain.Event.RadioButtonQuestionsIndexBackref錯誤 ----> System.IndexOutOfRangeException:此SqlCeParameterCollection不包含ParameterIndex爲'3'的SqlCeParameter。
因此,如果一列真的被引用兩次,那麼導致該行爲的FNH配置有什麼問題?我正在嘗試一個雙向關係(一個事件有很多單選按鈕問題)與訂購(我會保持它,因爲NH不會在一個比爾關係,從我讀過的)。 FWIW我也試圖通過從RadioButtonQuestion
中刪除Event
並將它作爲單向關係,並且它仍導致相同的異常。
FWIW,我可以得到異常去如果我使用Inverse()而不是Not.Inverse(),但這看起來很奇怪......父母應該管理這個,所以我想要Not.Inverse(),我想。 –
這個問題的第一句話是我需要的答案,措辭很好,謝謝! – MrBoJangles