Ответ 1
Это намного проще, чем я думал.
Map(x => x.WhateverThePropertyNameIs).CustomType(typeof(MyEnumeration));
У меня есть класс доступа к данным с Enum под названием Salutation:
public enum Salutation
{
Unknown = 0,
Dame = 1,
etc
Mr = 5,
etc
}
Я перехожу к классу с NHibernate, и до этого утра я использовал файлы .hbm.xml для сопоставления. Однако теперь я переключился на использование Fluent NHibernate, но загрузка экземпляров класса не выполняется (например):
[HibernateException: не может обрабатывать 5 в качестве приветствия]
Как вы можете видеть, 5 следует анализировать как "Приветствие" (предполагая, что 5 - это int, из сообщения об ошибке невозможно сказать).
Кто-нибудь знает, что здесь происходит?
Спасибо
Дэвид
Это намного проще, чем я думал.
Map(x => x.WhateverThePropertyNameIs).CustomType(typeof(MyEnumeration));
Другой вариант: EnumConvention:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestApp
{
using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.AcceptanceCriteria;
using FluentNHibernate.Conventions.Inspections;
using FluentNHibernate.Conventions.Instances;
public class EnumConvention :
IPropertyConvention,
IPropertyConventionAcceptance
{
#region IPropertyConvention Members
public void Apply(IPropertyInstance instance)
{
instance.CustomType(instance.Property.PropertyType);
}
#endregion
#region IPropertyConventionAcceptance Members
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(x => x.Property.PropertyType.IsEnum ||
(x.Property.PropertyType.IsGenericType &&
x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) &&
x.Property.PropertyType.GetGenericArguments()[0].IsEnum)
);
}
#endregion
}
}
Чтобы использовать эту enumconvention:
...
var fluentCfg = Fluently.Configure().Database(cfg).Mappings(
m => m.FluentMappings.AddFromAssemblyOf<SomeObjectMap>().Conventions.Add<EnumConvention>());
...
И в файле сопоставления
Map(x => x.SomeEnumField);