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

时间:2014-04-22 17:26:07

标签: c# nhibernate orm fluent-nhibernate nhibernate-mapping

给出以下架构:

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

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

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

BarStatus [LookUp Table]
----------
TypeE

类型和设置表是静态的,它们包含可以映射到enum的静态数据。 A.k.a查找表。 FooBar是普通表。

我的问题是;如何使用Fluent NHibernate以惯用方式映射这些查找表?什么是最佳做法?

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

enum TypeC { ... }
enum TypeD { ... }

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

从代码创建new FooType()会导致在查找表中插入新的FooType,这是不可取的(相同的数据,不同的表ID)

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

可以将FooType创建为单身人士吗?

1 个答案:

答案 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?