2012-05-01 6 views
2

私のMassTransit sagaには、正しくマップされないフィールドが1つしかありません。それはある -IDictionary <string、string>をFluent NHibernateのクラスマッピングでマッピングし、そのマッピングをテストするには?

私はそれをカップルの方法をマッピングしようとした
public virtual IDictionary<string, string> Rows 
    { 
     get { return _rows; } 
     set { _rows = value; } 
    } 

- 私は

[Test] public void ProjCtSagaMapTest() 
    { 
     using (var session = Utility.CreateSession<ProjCtSaga, ProjCtSagaMap>()) 
     { 
      new PersistenceSpecification<ProjCtSaga>(session) 
       .CheckReference(
        i => i.Rows, 
        new Dictionary<string, string> { { "key", "value" } }, 
        new DictionaryComparer<string, string>()) 
       .VerifyTheMappings(); 
     } 

-

publich ProjCTSagaMap() // ctor for my ClassMap subclass 
    { 
     /*HasMany(x => x.Rows) 
      .AsMap("ProjectNumber") 
      .KeyColumns.Add("Row", mapping => mapping.Name("Row").SqlType("nvarchar").Not.Nullable()) 
      .Cascade.AllDeleteOrphan() 
      .Table("ProjCtSagaRow");*/ 

     HasMany(x => x.Rows) 
      .Table("ProjCtSagaRow") 
      .KeyColumn("CorrelationId") 
      .Element("Row") 
      .AsMap("ProjectNumber") 
      .Inverse(); 
    } 

そして、私はマッピングをテストするためのユニットテストを書いています問題が実際にどこにあるのか、マッピングにあるのか、テストにいるのかは不明です。ユニットテストでは、実際のエラーである -

NHibernate.MappingException occurred 
    Message=No persister for: System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 
    Source=NHibernate 
    StackTrace: 
     at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName) 
     at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj) 
     at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) 
     at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event) 
     at NHibernate.Impl.SessionImpl.Save(Object obj) 
     at FluentNHibernate.Testing.PersistenceSpecification`1.TransactionalSave(Object propertyValue) in d:\Builds\FluentNH\src\FluentNHibernate\Testing\PersistenceSpecification.cs:line 79 
    InnerException: 

誰かがのClassMapでのIDictionaryをマッピングし、PersistenceSpecificationとそのマッピングをテストする方法を説明することができます... VerifyMappings()?

PS - FluentNHibernateのバージョンは1.3.0.717、NHibernateのバージョンは3.2.0.4000です。私は1つのマイナーで無関係な変更に対してローカルにコンパイルする必要がありました。

ありがとうございました!


は、ここで私は今取得していますエラーの残りの部分だ - 要素は後方参照を維持することはできませんので、

System.FormatException : Failed to convert parameter value from a String to a Int32. 
    ----> System.FormatException : Input string was not in a correct format. 
at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType) 
at System.Data.SqlClient.SqlParameter.GetCoercedValue() 
at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc) 
at System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser, SqlParameterCollection parameters) 
at System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior behavior, String commandText, SqlParameterCollection parameters, ref _SqlRPC rpc) 
at System.Data.SqlClient.SqlCommand.AddBatchCommand(String commandText, SqlParameterCollection parameters, CommandType cmdType) 
at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery() 
at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) 
at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps) 
at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch() 
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() 
at FluentNHibernate.Testing.PersistenceSpecification`1.TransactionalSave(Object propertyValue) in d:\Builds\FluentNH\src\FluentNHibernate\Testing\PersistenceSpecification.cs: line 80 
at FluentNHibernate.Testing.PersistenceSpecification`1.VerifyTheMappings(T first) in d:\Builds\FluentNH\src\FluentNHibernate\Testing\PersistenceSpecification.cs: line 52 
at Appalappa.Tests.ProjCtTests.ProjCtSagaMapTest() in ProjCtTests.cs: line 32 
--FormatException 
at System.Number.StringToNumber(String str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo info, Boolean parseDecimal) 
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) 
at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType) 

答えて

2

.Inverse();を取り除く、それは文字列です。

CheckReference参考用ですが、コレクションがあります。 CheckEnumerableまたはCheckList

アップデートを使用する:これは私

.CheckComponentList(p => p.Rows, 
        new[] { new KeyValuePair<string, string>("1", "2") }, 
        (p, item) => p.Rows.Add(item)); 
+0

申し訳ありませんのために動作しますが、あなたは、この場合、チェックリストやCheckReferenceを使用する方法の例を与えることができますか?私は '' .CheckList(i => i.Rows、new Dictionary {{"key"、 "value"}}) ''を試しましたが、 '' NHibernate.MappingException:No persister for: System.Collections.Generic.KeyValuePair'2 [System.String、mscorlib、Version = 4.0.0.0、Culture =ニュートラル、PublicKeyToken = b77a5c561934e089]、[System.String、mscorlib、バージョン= 4.0.0.0、Culture =ニュートラル、PublicKeyToken = b77a5c561934e089]] ''例外です。 –

+0

さて、あなたがお勧めしたとおりにしましたが、次の例外があります。 - 「System.FormatException:StringからInt32へのパラメータ値の変換に失敗しました。 ----> System.FormatException:入力文字列が正しい形式ではありませんでした。 System.Data.SqlClient.SqlParameter.CoerceValue(オブジェクト値、MetaTypeのdestinationType)で を返します。スタックトレースは、元のポストにペーストされて貼り付けられます。 –

+0

不幸なことに、これは文字列キーを整数列にマップしようとすると、FNHのバグと思われます。 ** AsMap ( "ProjectNumber")**はそれを解決する必要があります – Firo

関連する問題