使用Fluent NHibernate和NHibernate 3将Enum作为Int映射

时间:2011-03-21 19:00:04

标签: nhibernate fluent-nhibernate nhibernate-mapping

我过去使用此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 );
    }
}

3 个答案:

答案 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的最新版本。