2010-09-27 35 views
3

我想在NHibernate中使用Fluent NHibernate映射一个枚举集合,然后对该枚举集合的内容执行查询,但系统每次都会抛出异常。在NHibernate中映射一个枚举集合

我有一个Widget类,映射到Widget表。还有一个WidgetType枚举,并且一个Widget实例可以有许多WidgetTypes,通过WidgetTypes属性映射。该属性需要映射到一个单独的表WidgetTypeRef,它带有两个整数列:WidgetId和WidgetType。

public class Widget 
{ 
    /* omitted */ 
    public IList<WidgetType> WidgetTypes { get; set; } 
} 
public enum WidgetType 
{ 
    SomeType = 0, 
    SomeOtherType = 1, 
    YetOneMoreType = 2 
} 
public partial class WidgetMapping : IAutoMappingOverride<Widget> 
{ 
    public void Override(AutoMapping<Widget> mapping) 
    { 
    /* omitted */ 
    mapping.HasMany(w => w.WidgetTypes) 
     .Table("WidgetTypeRef") 
     .KeyColumn("WidgetId") 
     .Element("WidgetType"); 
    } 
} 

我无法控制数据库模式;该架构无法更改。模式必须存储与Widget关联的WidgetTypes的整数值,并且不能转换为匹配枚举的字符串版本。我非常努力保持enum的强类型,并且避免为Ref表创建新实体。

其他类具有与“.CustomType(typeof(someTypeEnum)”配置一起工作的基于枚举的类型属性,但HasMany映射中没有CustomType属性使用上面的HasMany映射,对集合的查询抛出“无法确定成员类型”异常

这是甚至可能的?应该如何设置属性?应如何配置Fluent映射?如何查询集合(我的查询只需要与一个Any或Contains)?

回答

2
public class EnumToIntConvention : IUserTypeConvention 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Property.PropertyType.IsEnum); 
    } 

    public void Apply(IPropertyInstance target) 
    { 
     target.CustomType(target.Property.PropertyType); 
    } 
} 

使用该约定,具有以下枚举:

public enum Status 
{ 
    Inactive = 0, 
    Active = 1, 
    Canceled = 2 
} 

并设置它像这样(应与流利的映射工作太):

var cfg = Fluently.Configure() 
    .Database(configurer) 
    .Mappings(m => 
    { 
     m.AutoMappings.Add(AutoMap.Assemblies(Assembly.GetExecutingAssembly()) 
      .Where(type => AutomapAssemblies.Contains(type.Namespace)) 
      .Conventions.Add<EnumToIntConvention>() // Magic code goes here! 
      .Conventions.Add()); 
    }); 

将保存integer值而不是string值。