Как сопоставить словарь со сложным типом ключа (CultureInfo) с помощью FluentNHibernate

#c# #.net #nhibernate #fluent-nhibernate

#c# #.net #nhibernate #fluent-nhibernate

Вопрос:

У меня есть словарь, который я сопоставляю, используя Fluent NHibernate. Словарь имеет сложный тип ключа CultureInfo . Моя база данных не может хранить этот тип, поэтому я хочу использовать его строковое представление.

В сопоставлениях, отличных от сопоставлений со словарем, я могу успешно сопоставлять CultureInfo -свойства, используя соглашение о типах пользователя. Теперь мне интересно, как это сделать для диктаторных отображений.

Вот объект, содержащий словарь:

 public class MultilingualPhrase : Entity
{
    private IDictionary<CultureInfo, string> languageValues;

    public virtual IDictionary<CultureInfo, string> LanguageValues
    {
        get
        {
            return languageValues;
        }
    }
}
  

И вот переопределение автоматического сопоставления для объекта:

 public void Override(AutoMapping<MultilingualPhrase> mapping)
{
    mapping
        .HasMany(n => n.LanguageValues)
        .Access.ReadOnlyPropertyThroughCamelCaseField()
        .AsMap<string>("CultureName")
        .Element("Phrase")
        .Table("MultilingualPhraseValues");
}
  

Это сопоставление (очевидно) вызывает следующую ошибку:

Не удалось преобразовать значение параметра из CultureInfo в строку.

Я знаю, что в NHibernate есть реализация пользовательского типа для CultureInfo (я использую ее для свойств сопоставления), но как мне указать это в моем переопределении сопоставления?

Ответ №1:

Это отлично работает с FNH ClassMap (не уверен насчет автоматического сопоставления) в NH 3.1 и FNH 1.2:

 HasMany(n => n.LanguageValues)
    .Access.ReadOnlyPropertyThroughCamelCaseField()
    .AsMap<CultureInfo>("CultureName")
    .Element("Phrase")
    .Table("MultilingualPhraseValues");
  

Комментарии:

1. Замечательно, я думаю, я был слишком сосредоточен на явном типе, когда asMap является целевым типом вместо исходного типа. Спасибо!