2011-03-21 42 views
23

我用这个How do you map an enum as an int value with fluent NHibernate?映射在过去,但我最近升级到NHibernate 3,这似乎并没有工作了。我在EnumConvention类中放置了断点,但它们没有被击中。正在访问数据库的查询将枚举作为默认配置的字符串。使用流利NHibernate和NHibernate的地图枚举作为Int

这对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); 
    } 
} 
+0

我真的看不到你从这个练习中获得什么,但是这可能因为某种原因被删除了,因为他们的力量发现需要保持它 – Baz1nga 2011-03-22 04:32:35

+0

我没有看到它消失的任何地方,它只是似乎没有工作了。那么该怎么办呢?做'Map(...).CustomType ()'不起作用。它会导致问题。我会尝试做一个自定义的IUserType,看看现在是否可行。 – 2011-03-22 14:31:05

+0

林说,你有任何理由将其存储为一个int而不是枚举吗?随着mem nt一个概率我真的没看到一个原因..字符串枚举是代码安全.. – Baz1nga 2011-03-22 20:00:09

回答

43

简单地做Map(m => m.MyEnum).CustomType<MyEnum>()似乎现在的工作就好了。

如果有人知道为什么IUserTypeConvention不能在NHibernate 3中使用流利NHibernate,我仍然想知道为什么。也许这是因为将自定义类型映射到枚举现在可行,但为什么它不是从lib中删除?

+0

简单的解决方案...为我节省了大量的时间调试! – 2011-06-28 16:35:57

+0

工作完美,谢谢! – vfilby 2012-10-12 02:37:36

+0

这个解决方案对我来说更好,它试图定义一个约定。按照惯例,类型未按预期在SQL Server 2014表上设置。 – gopherr 2015-08-26 18:32:51

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和流利的最后一个版本。