给出以下架构:
Foo
----------
BarId
FooA
FooB
FooTypeId
FooType [LookUp Table]
----------
TypeC
TypeD
Bar
----------
BarZ
BarStatusId
BarStatus [LookUp Table]
----------
TypeE
类型和设置表是静态的,它们包含可以映射到enum
的静态数据。 A.k.a查找表。 Foo
和Bar
是普通表。
我的问题是;如何使用Fluent NHibernate以惯用方式映射这些查找表?什么是最佳做法?
class FooType
{
TypeC ...
TypeD ...
}
enum TypeC { ... }
enum TypeD { ... }
在应用程序的生命周期内,是否在内存/缓存中维护单个实体FooType
?每次想要使用它时,是否会从数据库中读取FooType
实体?
从代码创建new FooType()
会导致在查找表中插入新的FooType
,这是不可取的(相同的数据,不同的表ID)
处理查找表时的最佳做法是什么?
可以将FooType
创建为单身人士吗?
答案 0 :(得分:0)
只是我的意见/实践。
根本不创建查找表 - 保存查询不必要的连接。只需将列直接映射到enum
属性即可。 NHibernate通常会使用枚举的字符串版本 - 如果对这些列进行过滤,则为它们添加索引。
如果你真的想要使用整数值(为什么你会这样,db变得人类不可读),但是因为有些传统的chod,你必须使用属性和约定......
/// <summary>
/// flags that a property of type enum is persisted with enum item's numerical value
/// </summary>
[Serializable]
[AttributeUsage(AttributeTargets.Property)]
public class NumericEnumAttribute : Attribute
{
}
/// <summary>
/// convention for the <see cref="NumericEnumAttribute"/> - ensures that the enum value is persisted as an integer
/// </summary>
public class NumericalEnumConvention : AttributePropertyConvention<NumericEnumAttribute>
{
protected override void Apply(NumericEnumAttribute attribute, IPropertyInstance instance)
{
instance.CustomType(instance.Property.PropertyType);
}
}
如果要使用只读的表 - 那么您应该探索实体配置的缓存选项和只读标志。将实体标记为只读。对此有很好的提醒:
Set up caching on entities and relationships in Fluent Nhibernate?