#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 является целевым типом вместо исходного типа. Спасибо!