使用Fluent NHibernate和NHibernate 3将枚举映射为整数

23

以前我使用了如何使用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>

当为枚举类型指定了 IUserTypeConvention 时,使用 GenericEnumMapper 似乎不正确。

这是我的约定:

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 );
    }
}

我真的不明白你在这个练习中获得了什么,但是这可能已经被删除了,因为他们没有发现需要保留它的理由。 - Baz1nga
我没有看到它消失在哪里,只是似乎不再起作用了。那么还有什么其他方法可以实现呢?使用 Map( ... ).CustomType<int>() 也不行,会引起问题。我现在尝试创建一个自定义的 IUserType,看看是否可行。 - Josh Close
我是说,你存储为整数而不是枚举,有没有任何理由?对于内存来说不是问题,我真的看不出有什么理由……字符串枚举更加安全。 - Baz1nga
啊,实际上它在数据库中作为一个表存在,所以枚举的 int 值与表行的 id 对应。该表是固定的,不能更改,因此我想使用枚举来表示它。 - Josh Close
3个回答

48

现在只需要简单地执行Map(m => m.MyEnum).CustomType<MyEnum>()就可以正常工作了。

如果有人知道为什么在NHibernate 3中,IUserTypeConvention与Fluent NHibernate不起作用,我仍然想知道原因。也许是因为现在将自定义类型映射到枚举类型,但为什么它没有从库中删除呢?


简单的解决方案...让我省了很多时间来调试它! - Jason Barile
这个解决方案对我来说比试图定义一个公约更有效。使用公约时,SQL Server 2014表上的类型没有如预期般设置。 - gopherr

1

0

你应该继承自FluentNHibernate.Conventions.UserTypeConvention,而不是IUserTypeConvention。

例如,这是我用来将布尔值和可空布尔值映射到名为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的最新版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接