C# 映射静态/枚举/查找表,如FootType和BarStatus

C# 映射静态/枚举/查找表,如FootType和BarStatus,c#,nhibernate,orm,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Orm,Fluent Nhibernate,Nhibernate Mapping,给定以下模式: Foo ---------- BarId FooA FooB FooTypeId FooType [LookUp Table] ---------- TypeC TypeD Bar ---------- BarZ BarStatusId BarStatus [LookUp Table] ---------- TypeE 类型和设置表是静态的,它们包含可以映射到枚举的静态数据。又称查找表。Foo和Bar是普通表 我的问题是,;如何使用Fluent NHibernate习惯性

给定以下模式:

Foo
----------
BarId
FooA
FooB
FooTypeId

FooType [LookUp Table]
----------
TypeC
TypeD

Bar
----------
BarZ
BarStatusId

BarStatus [LookUp Table]
----------
TypeE
类型和设置表是静态的,它们包含可以映射到枚举的静态数据。又称查找表。Foo和Bar是普通表

我的问题是,;如何使用Fluent NHibernate习惯性地映射这些查找表?最佳做法是什么

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

enum TypeC { ... }
enum TypeD { ... }
在应用程序的生命周期中,是否在内存/缓存中维护单个FootType实体?是否每次需要使用FooType实体时都会从db中读取它

从代码创建一个新的FooType将导致在查找表中插入一个新的FooType,而不需要相同的数据、不同的表id

处理查找表时的最佳实践是什么


FooType可以作为一个单身汉创建吗?

这只是我的观点/实践

根本不创建查找表-保存查询和不必要的连接。只需将列直接映射到枚举属性即可。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);
    }
}
如果您想使用只读表,那么您应该研究实体配置的缓存选项和只读标志。将实体标记为只读。这里有一个很好的提示:


谢谢您的回答,不幸的是,我继承了一个数据库,无法更改模式。我将研究只读标志,感谢链接。