NHibernate / Fluent NHibernate动态列映射

我有一个表,其中一些列在编译时是未知的。 这些列可以是整数值,也可以是某个枚举值。 有一个表包含此类动态列的所有名称,并且还包含列的类型。 这个“metatable”有以下几列:

  • DynamicColumnId(Pk)
  • 名称
  • TypeId(整数/枚举,从单独的表中作为Fk)

整数列具有此表中的名称 ,而Enum列是来自具有该名称的表的Fk列,具有一些修改(例如“DynamicTable”前缀)。

我能想到的唯一解决方案是使用Reflection.Emit动态创建一个Entity类和一个相应的Mapping类。 不可否认,我是NHybernate / Fluent NHybernate的新手,它似乎是表之间相对简单的层次结构,所以我想validation我的解决方案并不像最初看起来那样难看……

我也欢迎完全忽略我的表层次结构的解决方案,以便有效地实现相同的结果(即,枚举动态表上的行,遍历所有列,知道它们是否是枚举,如果它们是,他们可能的价值观)。

编辑:附加信息问题域 )我最初包含最少的细节,以避免太多信息相关的混淆。 这种描述要复杂得多,但它揭示了这种设计背后的动机。

涉及的应用程序旨在自动化日志/转储分析。 分析场景经常由日志/转储专家提供,因此,为了简化需求=>实现=>validation周期的典型过程,这些分析场景由专家直接实现为Iron Python代码片段,一些特定于域的构造注入到片段的范围内。 每个片段都有一个与其相关的“上下文”。 “上下文”的一个例子可能是“产品”,“版本”等……所以,代码片段本身只在某些上下文中调用 – 这有助于通过消除分支来简化Python代码(您可以将其视为面向方面编程, 在某种程度上)。 在为各种上下文选择值之后,非专家可以使用具有给定代码上下文数据库的应用程序来分析日志/转储。 当专家决定为某个代码片段编目需要新的上下文时,他可以添加一个上下文,指示它可能具有的值。 将新上下文添加到数据库后,将为运行分析的非专家提供为新添加的上下文选择值的选项。 “动态表”是将代码段与发布代码段时存在的各种上下文(列)的值相关联的表,以及当时不存在的列的默认值。

我不会声称完全理解你的场景,但在我看来,你最好使用像Redis这样的键值存储或像CouchDB这样的无模式数据库而不是SQL。 对于关系数据库来说这似乎不是问题,但是如果你真的需要使用RDBMS,我会尽可能地将NHibernate映射到真实模式(DynamicColumnId,Name,TypeId),然后构建你需要的任何数据结构最重要的是。