2012-05-01 2 views
2

Сага MassTransit имеет только одно поле, которое не будет правильно отображаться. Это -Как сопоставить IDictionary <string, string> с сопоставлением классов Fluent NHibernate и проверить это сопоставление?

public virtual IDictionary<string, string> Rows 
    { 
     get { return _rows; } 
     set { _rows = value; } 
    } 

Я попытался картирование его пару способов -

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(); 
    } 

И я написал модульный тест, чтобы проверить отображение -

[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(); 
     } 

Я не уверен, где проблема на самом деле лежит, в сопоставлении или в тесте. Фактическая ошибка в тестовом модуле есть -

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: 

Может кто-нибудь объяснить, как сопоставить IDictionary с ClassMap и проверить, что отображение с PersistenceSpecification ... VerifyMappings()?

PS - Версия FluentNHibernate - 1.3.0.717, а версия NHibernate - 3.2.0.4000. Мне пришлось составлять его локально для одного незначительного и несвязанного изменения.

Спасибо!


Вот остальные ошибки, которые я получаю сейчас -

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

Update: это работает для меня

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

Извините, но вы можете дать пример того, как использовать CheckList или CheckReference в этом случае? Я попробовал '.CheckList (i => i.Rows, новый словарь {{" key "," value "}})', но он выдает только "NHibernate.MappingException: No persister for: System.Collections.Generic.KeyValuePair'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]] Исключение. –

+0

Итак, я сделал точно так, как вы рекомендовали, но я получаю следующее исключение: '' System.FormatException: Не удалось преобразовать значение параметра из строки в Int32. ----> System.FormatException: строка ввода не была в правильном формате. в System.Data.SqlClient.SqlParameter.CoerceValue (значение объекта, тип назначения метатекста) ''. Трассировка стека вставлена ​​в вставленном в исходное сообщение. –

+0

, к сожалению, это кажется ошибкой в ​​FNH, когда он пытается сопоставить строковый ключ с целым столбцом. **. AsMap («ProjectNumber») ** должен решить это – Firo