NHibernate / Fluent NHibernate动态列映射

时间:2010-03-09 03:58:29

标签: c# database nhibernate fluent-nhibernate reflection.emit

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

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

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

我能想到的唯一解决方案是使用Reflection.Emit动态创建一个Entity类和一个相应的Mapping类。不可否认,我是NHybernate / Fluent NHybernate的新手,它似乎是表之间相对简单的层次结构,因此我想验证我的解决方案并不像最初出现的那样丑陋......

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

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

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

1 个答案:

答案 0 :(得分:0)

我不会声称完全了解您的方案,但在我看来,您最好使用Redis之类的键值存储或{{3}之类的无架构数据库。而不是SQL。对于关系数据库来说这似乎不是问题,但如果你真的需要使用RDBMS,我会尽可能地将NHibernate映射到真实模式(DynamicColumnId,Name,TypeId),然后构建你需要的任何数据结构顶部