问题确实说明了一切,默认值是将其映射为,string
但我需要将其映射为int
。
我目前正在使用它PersistenceModel
来设置我的约定,如果有什么不同的话。提前致谢。
更新 发现从主干获取最新版本的代码解决了我的麻烦。
问题确实说明了一切,默认值是将其映射为,string
但我需要将其映射为int
。
我目前正在使用它PersistenceModel
来设置我的约定,如果有什么不同的话。提前致谢。
更新 发现从主干获取最新版本的代码解决了我的麻烦。
Answers:
定义此约定的方式有时是在以前更改的,现在是:
public class EnumConvention : IUserTypeConvention
{
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(x => x.Property.PropertyType.IsEnum);
}
public void Apply(IPropertyInstance target)
{
target.CustomType(target.Property.PropertyType);
}
}
因此,如上所述,从后备箱中获取最新版本的Fluent NHibernate使我到达了需要的位置。具有最新代码的枚举的映射示例为:
Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));
自定义类型强制将其作为枚举的实例进行处理,而不是使用GenericEnumMapper<TEnum>
。
我实际上正在考虑提交一个修补程序,以便能够在保留字符串的枚举映射器和保留int的枚举映射器之间进行更改,因为这似乎应该可以设置为约定。
这突然出现在我最近的活动中,而Fluent NHibernate的较新版本中的内容进行了更改,从而使此操作变得更加容易。
为了使所有枚举都映射为整数,您现在可以创建如下约定:
public class EnumConvention : IUserTypeConvention
{
public bool Accept(IProperty target)
{
return target.PropertyType.IsEnum;
}
public void Apply(IProperty target)
{
target.CustomTypeIs(target.PropertyType);
}
public bool Accept(Type type)
{
return type.IsEnum;
}
}
然后,您的映射只需是:
Map(quote => quote.Status);
像这样将约定添加到Fluent NHibernate映射中;
Fluently.Configure(nHibConfig)
.Mappings(mappingConfiguration =>
{
mappingConfiguration.FluentMappings
.ConventionDiscovery.AddFromAssemblyOf<EnumConvention>();
})
./* other configuration */
不要忘记可为空的枚举(如ExampleEnum? ExampleProperty
)!它们需要单独检查。这是通过新的FNH样式配置完成的:
public class EnumConvention : IUserTypeConvention
{
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(x => x.Property.PropertyType.IsEnum ||
(x.Property.PropertyType.IsGenericType &&
x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) &&
x.Property.PropertyType.GetGenericArguments()[0].IsEnum)
);
}
public void Apply(IPropertyInstance target)
{
target.CustomType(target.Property.PropertyType);
}
}
int
?当类型接受Flags时?像:MyEnum.Active | MyEnum.Paused
这就是我用int值映射枚举属性的方式:
Map(x => x.Status).CustomType(typeof(Int32));
为我工作!
对于那些将Fluent NHibernate与Automapping一起使用的人(可能还有一个IoC容器):
这IUserTypeConvention
是@ 朱利安上面的答案:https : //stackoverflow.com/a/1706462/878612
public class EnumConvention : IUserTypeConvention
{
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(x => x.Property.PropertyType.IsEnum);
}
public void Apply(IPropertyInstance target)
{
target.CustomType(target.Property.PropertyType);
}
}
Fluent NHibernate Automapping配置可以这样配置:
protected virtual ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(SetupDatabase)
.Mappings(mappingConfiguration =>
{
mappingConfiguration.AutoMappings
.Add(CreateAutomappings);
}
).BuildSessionFactory();
}
protected virtual IPersistenceConfigurer SetupDatabase()
{
return MsSqlConfiguration.MsSql2008.UseOuterJoin()
.ConnectionString(x =>
x.FromConnectionStringWithKey("AppDatabase")) // In Web.config
.ShowSql();
}
protected static AutoPersistenceModel CreateAutomappings()
{
return AutoMap.AssemblyOf<ClassInAnAssemblyToBeMapped>(
new EntityAutomapConfiguration())
.Conventions.Setup(c =>
{
// Other IUserTypeConvention classes here
c.Add<EnumConvention>();
});
}
*然后CreateSessionFactory
可以轻松地在IoC中使用,例如Castle Windsor(使用PersistenceFacility和安装程序)。*
Kernel.Register(
Component.For<ISessionFactory>()
.UsingFactoryMethod(() => CreateSessionFactory()),
Component.For<ISession>()
.UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
.LifestylePerWebRequest()
);
您应该在数据库表中将值保留为int / tinyint。为了映射您的枚举,您需要正确指定映射。请参见下面的映射和枚举示例,
映射类
公共类TransactionMap:ClassMap事务 { 公共TransactionMap() { //其他映射 ..... //映射为枚举 Map(x => x.Status,“ Status”)。CustomType(); Table(“ Transaction”); } }
枚举
公共枚举TransactionStatus { 等待= 1, 已处理= 2 RolledBack = 3, 封锁= 4, 退款= 5 已处理= 6, }