5

私はすべての投稿を読み、列が2回参照されているためにIndexOutOfRangeが通常発生することを知っています。しかし、私のマッピングに基づいて、それがどのように起こっているのかわかりません。構成でSHOW_SQLがtrueの場合、テーブルへの挿入が表示され、Events次にテーブルをIndexOutOfRangeException参照するが表示されRadioButtonQuestionsます。例外を生成するために使用しようとしているSQLが表示されません。AutoMappingを使用しClassMapてみましたが、問題を絞り込むために、これら2つのクラスをフルに切り替えました。

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)
)

これは、NH3.3.0.4000およびFNH1.3.0.727を使用しています。(RadioButtonQuestionを添付して)新しいイベントを保存しようとすると、次のように表示されます。

NHibernate:INSERT INTO Events(EventDate、Title)VALUES(@ p0、@ p1); @ p0 = 5/21/2012 12:32:11 PM [Type:DateTime(0)]、@ p1 ='My Test Event' [タイプ:文字列(0)] NHibernate:@@IDENTITYを選択

Events.Tests.Events.Tasks.EventTasksTests.CanCreateEvent:NHibernate.PropertyValueException:Events.Domain.RadioButtonQuestion._Events.Domain.Event.RadioButtonQuestionsIndexBackrefのプロパティ値の脱水エラー----> System.IndexOutOfRangeException:ParameterIndex「3」のSqlCeParameterこのSqlCeParameterCollectionには含まれていません。

したがって、列が実際に2回参照されている場合、その動作を引き起こしているFNH構成の問題は何ですか?私は注文との双方向関係(1つのイベントに多くのラジオボタンの質問があります)を試みています(私が読んだことから、NHは双方向関係にないのでそれを維持します)。FWIWEventからRadioButtonQuestionを削除して一方向の関係としてこれも試しましたが、それでも同じ例外が発生しました。

4

3 に答える 3

7

私はコード (NH 3.3.1) でマッピングを使用していますが、Update(false) と Insert(false) を追加すると問題が解決することに気付きました。

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);
});
于 2012-08-29T18:09:31.753 に答える
5

双方向の関連付けがあるため、一方を Inverse() としてマークする必要があり、RadioButtonQuestions コレクションのみにすることができます。コレクションを所有者にしたい場合は、RadioButtonQuestion クラスでイベントへの参照を削除する必要があります。

さらに、RadioButtonQuestions テーブルの EventId 列は null 値を許容できないため、コレクション マッピングが逆でない場合、問題が発生する可能性があります。ドキュメントのを参照してください。

于 2012-05-21T18:41:48.037 に答える