4

我讀過所有的帖子,並知道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並將它作爲單向關係,並且它仍導致相同的異常。

+0

FWIW,我可以得到異常去如果我使用Inverse()而不是Not.Inverse(),但這看起來很奇怪......父母應該管理這個,所以我想要Not.Inverse(),我想。 –

+0

這個問題的第一句話是我需要的答案,措辭很好,謝謝! – MrBoJangles

回答

3

您有一個雙向關聯,所以一方應該標記爲逆(),並且只能是RadioButtonQuestions集合。如果您希望集合成爲所有者,則必須在RadioButtonQuestion類中刪除對該事件的引用。

此外,RadioButtonQuestions表中的EventId列不可爲空,如果集合映射不相反,則會導致問題。請參閱文檔中的note

+0

煩人。我真的想要雙向關係......如果在這種情況下這是正確的模型,並且重新閱讀雙向文檔,它似乎是唯一的選擇,我想我可以忍受Inverse()。我想知道爲什麼是這樣。猜測NH真的不希望你使用bidir ...你也失去了自動列表索引。至於可爲空,我的單元測試創​​建和更新正在通過,但我會留意它。 –

6

我正在使用的代碼映射(NH 3.3.1),我已經注意到,添加更新(假)和插入(假)治癒的問題:

ManyToOne(x => x.DictionaryEntity, map => 
{ 
    map.Column("Dictionary"); 
    map.Update(false); 
    map.Insert(false); 
    map.Cascade(Cascade.None); 
    map.Fetch(FetchKind.Select); 
    map.NotFound(NotFoundMode.Exception); 
    map.Lazy(LazyRelation.Proxy); 
}); 
+0

太棒了。這解決了我的問題。我使用的是FluentNHibernate,需要使用:'.Not.Update()。Not.Insert()',但它仍然解決了它。謝謝! –