5

値オブジェクトへの参照を持つエンティティを検証するために PersitenceSpecification クラスを使用するたびに、この奇妙な ArgumentOutOfRangeException が発生します。

    public class CatalogItem : DomainEntity
    {
        internal virtual Manufacturer Manufacturer { get; private
set; }
        internal virtual String Name { get; private set; }

        protected CatalogItem()
        {}

        public CatalogItem(String name, String manufacturer)
        {
            Name = name;
            Manufacturer = new Manufacturer(manufacturer);
        }
    }

    public class CatalogItemMapping : ClassMap<CatalogItem>
    {
        public CatalogItemMapping()
        {
            Id(catalogItem => catalogItem.Id);

            Component<Manufacturer>(category => category.Manufacturer,
                                    m => m.Map(manufacturer =>
manufacturer.Name));

            Map(catalogItem => catalogItem.Name);
            Map(Reveal.Property<CatalogItem>("Price"));
        }
    }

    [TestFixture]
    public class When_verifying_the_class_mapping_of_a_catalog_item
        : NHibernateSpecification
    {
        [Test]
        public void Then_a_catalog_object_should_be_persistable()
        {
            new PersistenceSpecification<CatalogItem>(Session)
                .VerifyTheMappings();
        }
    }

    [TestFixture]
    public class NHibernateSpecification
        : Specification
    {
        protected ISession Session { get; private set; }

        protected override void Establish_context()
        {
            var configuration = new SQLiteConfiguration()
                .InMemory()
                .ShowSql()
                .ToProperties();

            var sessionSource = new SessionSource(configuration, new
RetailerPersistenceModel());
            Session = sessionSource.CreateSession();

            sessionSource.BuildSchema(Session);
            ProvideInitialData(Session);

            Session.Flush();
            Session.Clear();
        }

        protected override void Dispose_context()
        {
            Session.Dispose();
            Session = null;
        }

        protected virtual void ProvideInitialData(ISession session)
        {}
    }

これが私が得ているエラーです:

TestCase 'Then_a_catalog_object_should_be_persistable' が実行されませんでした: System.ArgumentOutOfRangeException : インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。パラメータ名:System.Collections.Generic.ListのSystem.ThrowHelper.ThrowArgumentOutOfRangeException()のSystem.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument引数、ExceptionResourceリソース)のindex1.get_Item(Int32 index) at System.Data.SQLite.SQLiteParameterCollection.GetParameter(Int32 index) at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (Int32 index) at NHibernate.Type.GuidType.Set(IDbCommand cmd, Object value, Int32 index) at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) at NHibernate.Action.EntityInsertAction.Execute() at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) at NHibernate.Engine.ActionQueue.ExecuteActions() at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource session) at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (FlushEvent event) at NHibernate.Impl.SessionImpl.Flush() at NHibernate.Transaction.AdoTransaction.Commit() d:\Builds\FluentNH\src\FluentNHibernate\Testing \PersistenceSpecification.cs(127,0): at FluentNHibernate.Testing.PersistenceSpecification1.TransactionalSave (オブジェクトのプロパティ値) d:\Builds\FluentNH\src\FluentNHibernate\Testing\PersistenceSpecification.cs(105,0): at FluentNHibernate.Testing.PersistenceSpecification`1.VerifyTheMappings () C:\Source\SupplyChain\Tests\ Retailer.IntegrationTests\Mappings\CatalogItemMappingSpecifications.cs(14,0): SupplyChain.Retailer.IntegrationTests.Mappings.When_verifying_the_class_mapping_of_a_catalog_item.Then_a_catalog_object_should_be_persistable () で

長い投稿で申し訳ありませんが、これで数時間忙しくなりました。NH 自体のこの JIRA チケットを見つけたので、これは FNH が原因ではない可能性があります。

http://forum.hibernate.org/viewtopic.php?p=2395409

私は自分のコードで何か間違ったことをしていることをまだ望んでいます:-)。何か考えはありますか?

前もって感謝します

4

7 に答える 7

15

そもそも自分の愚かさに起因するこの問題の解決策を見つけました。流暢な NH マッピングから hbm ファイルを生成するとすぐに、すべてが明らかになりました。

<class name="CatalogItem" table="`CatalogItem`" xmlns="urn:nhibernate-
mapping-2.2" optimistic-lock="version">
    ...

    <property name="Name" length="100" type="String">
      <column name="Name" />
    </property>

    ...

    <component name="Manufacturer" insert="false" update="true">
      <property name="Name" length="100" type="String">
        <column name="Name" />
      </property>
    </component>
  </class>

Name プロパティの列と Manufacturer コンポーネントの列が両方とも同じ列にマップされていることに注意してください。これが、列名よりも多くの引数があったため、ArgumentOutOfRangeException が発生した理由です。コンポーネント マッピングの列名を明示的に指定することで、これを解決しました。

Component(catalogItem => catalogItem.Manufacturer, m => m.Map(manufacturer => manufacturer.Name, "Manufacturer"));

別の教訓が得られました。

于 2009-03-06T21:28:24.493 に答える
2

私の場合、2 つのプロパティを同じ列にマッピングしていましたFluent NHibernate

于 2012-09-29T01:28:42.300 に答える
0

私の特定のケースでは、同じ.NETプロパティにプロパティとID(属性を使用)を追加していました。これにより、同じエラーが発生しました。

于 2010-08-22T10:00:41.697 に答える
0

はい、ノイズの一部を減らすためにそれを削除しました。マッピングからも削除するのを忘れていたと思います。さらに調査を行った後、製造元がコンポーネントとしてマップされていることに関係があることに気付きました。別のクラスの代わりに昔ながらの文字列を使用すると、すべて正常に動作します。

于 2009-03-02T06:35:52.907 に答える
0

ヘルパーを使用していると奇妙に思えるプロパティCatalogItemがないようです。PriceReveal

于 2009-03-01T20:46:30.827 に答える