我有一个具有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()
一样简单,但我似乎无法做到正确。
答案 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)