我过去使用此How do you map an enum as an int value with fluent NHibernate?进行映射,但我最近已升级到NHibernate 3,这似乎不再起作用了。我在我的EnumConvention课程中放了断点,但它们没有被击中。命中数据库的查询将枚举作为字符串,这是默认配置。
这如何与NHibernate 3一起使用?
更新
以下是生成的映射文件的一部分:
<property name="ComponentType" type="FluentNHibernate.Mapping.GenericEnumMapper`1[[...ComponentType, ..., Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], FluentNHibernate, Version=1.1.0.0, Culture=neutral, PublicKeyToken=8aa435e3cb308880">
<column name="ComponentTypeId" />
</property>
当为枚举指定GenericEnumMapper
时,它似乎是正确使用IUserTypeConvention
。
这是我的惯例:
public class EnumConvention : IUserTypeConvention
{
public void Accept( IAcceptanceCriteria<IPropertyInspector> criteria )
{
criteria.Expect( e => e.Property.PropertyType.IsEnum );
}
public void Apply( IPropertyInstance instance )
{
instance.CustomType( instance.Property.PropertyType );
}
}
答案 0 :(得分:43)
简单地执行Map( m => m.MyEnum ).CustomType<MyEnum>()
似乎现在工作正常。
如果有人知道为什么IUserTypeConvention
不适用于NHibernate 3中的Fluent NHibernate,我仍然想知道原因。也许这是因为将自定义类型映射到枚举现在可以正常工作,但为什么它不会从lib中删除呢?
答案 1 :(得分:1)
我遇到了与Nhibernate 3.0GA和FluentNh类似的问题(用最新的NH版本重建)。 UserTypeConventions未正确注册。
这里描述的问题: http://groups.google.com/group/nhusers/browse_thread/thread/c48da661f78bfad0
答案 2 :(得分:0)
你应该继承你的约定而不是来自IUserTypeConvention,而是来自FluentNHibernate.Conventions.UserTypeConvention。
例如,这是我用来将布尔值和可空布尔值映射到名为 UserTrueFalseType 的自定义类型的确切约定:
/// <summary>
/// Convention: Boolean fields map to CHAR(1) T/F/Null
/// </summary>
public class BooleanTrueFalseConvention : FluentNHibernate.Conventions.UserTypeConvention<UserTrueFalseType>
{
/// <summary>
/// Accept field type criteria
/// </summary>
/// <param name="criteria"></param>
public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
{
criteria.Expect(instance =>
instance.Property.PropertyType.Equals(typeof(System.Boolean))
||
instance.Property.PropertyType.Equals(typeof(System.Nullable<System.Boolean>))
);
}
}
这适用于NH 3.3和Fluent的最新版本。