NHibernate可以配置为自动为特定类型的所有列调用.CustomType <t>吗?</t>

时间:2014-01-05 23:46:54

标签: c# nhibernate fluent-nhibernate

我有一个具有Enum类型属性的模型:

public virtual Units Unit { get; set; } // Units is an enum

我有一个名为EnumMapper的类,它处理我用于数据库的一些自定义映射逻辑。在我的映射中,我有:

Map(x => x.Unit).CustomType<EnumMapper<Units>>();

这很有效。没问题。但是,我有很多具有Units类型属性的模型。而不是在每一个上调用.CustomType<T>(),我想知道我是否可以向我的FluentConfiguration对象添加一些内容,告诉NHibernate在 any和all 上使用此类型映射类型Units的属性。以下是我到目前为止配置NHibernate的方法:

private ISessionFactory InitializeSessionFactory()
{
   sessionFactory = Fluently.Configure()
      .Database(DatabaseConfiguration)
      .Mappings(m => m.FluentMappings
          .AddFromAssemblyOf<DatabaseAdapter>()
          .Conventions.Add(Table.Is(x => x.EntityType.Name.ToLowerInvariant())) // All table names are lower case
          .Conventions.Add(ForeignKey.EndsWith("Id"))                           // Foreign key references end with Id
          .Conventions.Add(DefaultLazy.Always()))
      .BuildSessionFactory();

   return sessionFactory;
}

我觉得这就像在其他地方调用.Conventions.Add()一样简单,但我似乎无法做到正确。

1 个答案:

答案 0 :(得分:0)

使用ConventionBuilder找出一个解决方案:

.Conventions.Add(ConventionBuilder.Property.When(
  c => c.Expect(x => x.Type == typeof(GenericEnumMapper<Units>)),
  x => x.CustomType<EnumMapper<Units>>()
))

它不是很漂亮,但它有效。我认为更好的解决方案可能是编写自己的convention,自动将枚举映射到正确的自定义类型。如果我让它发挥作用,我会在这里张贴。

更新:稍微清理了一下。我在我的EnumMapper<T>类中添加了一个静态方法:

public class EnumMapper<T> : NHibernate.Type.EnumStringType<T>
{
   // Regular mapping code here

   public static IPropertyConvention Convention
   {
      get
      {
         return ConventionBuilder.Property.When(
            c => c.Expect(x => x.Type == typeof (GenericEnumMapper<T>)),
            x => x.CustomType<EnumMapper<T>>()
            );
      }
   }
}

现在我可以配置它:

.Conventions.Add(EnumMapper<Units>.Convention)