映射静态/枚举/查找表,如 FooType 和 BarStatus
本文关键字:FooType BarStatus 静态 枚举 查找 映射 | 更新日期: 2023-09-27 17:59:19
给定以下模式:
Foo
----------
BarId
FooA
FooB
FooTypeId
FooType [LookUp Table]
----------
TypeC
TypeD
Bar
----------
BarZ
BarStatusId
BarStatus [LookUp Table]
----------
TypeE
类型和设置表是静态的,它们包含可以映射到enum
的静态数据。 Foo
和Bar
是普通表。
我的问题是;如何使用 Fluent NHibernate 按习惯地映射这些查找表?最佳实践是什么?
class FooType
{
TypeC ...
TypeD ...
}
enum TypeC { ... }
enum TypeD { ... }
是否在应用程序的生命周期内在内存/缓存中维护单个FooType
实体?是否每次想要使用它时都从数据库中读取FooType
实体?
从代码创建new FooType()
将导致将新FooType
插入到查找表中,这是不需要的(相同的数据,不同的表 ID(
处理查找表时的最佳做法是什么?
FooType
可以创建为单例吗?
只是我的意见/实践。
根本不创建查找表 - 保存查询不必要的联接。只需将一列直接映射到 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);
}
}
如果要使用只读表,则应浏览实体配置的缓存选项和只读标志。将实体标记为只读。在这里
提醒一下:在 Fluent Nhibernate 中设置实体和关系缓存?