功能NHibernate - IndexOutOfRange(Fluent NHibernate

2019-09-17 09:45发布

我读过所有的职位,并知道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我也试过这是一个单向的关系,通过移除EventRadioButtonQuestion ,它仍然造成了同样的异常。

Answer 1:

你有一个双向关联,所以一面应标为逆(),并且只能是RadioButtonQuestions集合。 如果你想收藏的是所有者,你必须删除在您的RadioButtonQuestion类的参照事件。

此外,在表中的RadioButtonQuestions EVENTID列不能为空,这会引起问题,如果集合映射不是相反。 见注的文件中。



Answer 2:

我使用的代码映射(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);
});


Answer 3:

我只花了一个上午铲除这个错误了。 该IndexOutOfRangeException给我发错了路开始,但我已经找到了原因。 我的问题关注的是,使用多个组件的FluentNHibernate类地图; 这个问题是两个性质inadvertedly,并错误地映射到同一列:

之前:

// example is stripped for simplicity, note the column names
Component(mappedClass => mappedClass.MappedComponent1,
          map => 
          {
              map.Map(c => c.SomeProperty, "samecolumn");
          });

Component(mappedClass => mappedClass.MappedComponent2,
          map => 
          {
              map.Map(c => c.OtherProperty, "samecolumn");
          });

后:

Component(mappedClass => mappedClass.MappedComponent1,
          map => 
          {
              map.Map(c => c.SomeProperty, "firstcolumn");
          });

Component(mappedClass => mappedClass.MappedComponent2,
          map => 
          {
              map.Map(c => c.OtherProperty, "secondcolumn");
          });

如何这导致IndexOutOfRangeException并不明显,我; 我猜有映射(源)特性的阵列和目的地列的阵列,并且在这种情况下,目标数组太短的源属性数组中的项的数量,因为一些目标列是相同的。

我想,但它是值得写FluentNHibernate pull请求来检查这一点,并抛出一个更明确的例外。



文章来源: Fluent NHibernate - IndexOutOfRange