映射静态/枚举/查找表,如 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的静态数据。 FooBar是普通表。

我的问题是;如何使用 Fluent NHibernate 按习惯地映射这些查找表?最佳实践是什么?

class FooType
{
    TypeC ...
    TypeD ...
}
enum TypeC { ... }
enum TypeD { ... }

是否在应用程序的生命周期内在内存/缓存中维护单个FooType实体?是否每次想要使用它时都从数据库中读取FooType实体?

从代码创建new FooType()将导致将新FooType插入到查找表中,这是不需要的(相同的数据,不同的表 ID(

处理查找表时的最佳做法是什么?

FooType可以创建为单例吗?

映射静态/枚举/查找表,如 FooType 和 BarStatus

只是我的意见/实践。

根本不创建查找表 - 保存查询不必要的联接。只需将一列直接映射到 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 中设置实体和关系缓存?