NHibernate / Fluent NHibernate 动态列映射

3
我有一个表格,其中某些列在编译时是未知的。这样的列可以是整数值或某个枚举值。有一张表格保存了这些动态列的所有名称以及列的类型。这个“元表”具有以下列:
- DynamicColumnId(主键) - 名称 - TypeId(整数/枚举,作为来自单独表的Fk)
整数列具有此表中的名称,而枚举列是具有该名称的表格的Fk列,并进行一些修改(例如,“DynamicTable”前缀)。
我能想到的唯一解决方案是使用Reflection.Emit动态创建实体类和相应的映射类。诚然,我对NHybernate / Fluent NHybernate还很新,而且它似乎是表格之间的一个相对简单的层次结构,因此我希望验证我的解决方案不像最初看起来那么丑陋...
我也欢迎完全忽略我的表格层次结构的解决方案,以有效地实现相同的结果(即枚举动态表上的所有列,了解它们是否是枚举以及它们可能的值)。
(编辑:问题域的其他信息)首先我只包括了最少的细节,以避免太多信息引起的混乱。这个描述更加复杂,但它揭示了这个设计背后的动机。
涉及的应用程序旨在自动化日志/转储分析。分析方案经常由日志/转储专家提供,因此为了简化要求=>实现=>验证周期的典型过程,这些分析方案由专家直接作为Iron Python代码片段实现,并将一些领域特定构造注入到片段的范围中。每个片段都有一个相关的“上下文”。例如,“产品”,“版本”等......因此,在某些上下文中才调用该片段,这有助于通过消除分支来简化Python代码(在某种程度上可以视为面向方面的编程)。非专家可以使用应用程序,并选择各种上下文的值来分析日志/转储。当专家决定需要一个新的上下文来对一个特定的代码片段进行编目时,他可以添加一个上下文,指示它可能具有的可能值。一旦将新上下文添加到数据库中,运行分析的非专家将获得选择新添加上下文值的选项。动态表是将代码片段与发出片段时存在的各个上下文(列)的值以及不存在该时间的列的默认值相关联的表格。

你的意思是你想在运行时修改数据库模式吗? - Paco
1
这通常是一种不好的设计方法。因此,它总是取决于具体情况。您能否提供更多领域特定信息,以便我们自己找出您需要完成的任务? - Will Marcouiller
我同意Will的观点,我还没有遇到过“动态表格”有意义的情况。 - Mauricio Scheffer
1
@Mauricio 和 Will:动态表格有其使用场景。像“SQL Server Management Studio”这样的数据库管理应用程序就是一个例子。问题在于动态表格被用于不适合的地方(或试图被用于不适合的地方)。由于这个问题没有描述动态表格的使用场景,所以我们又有什么资格去评判呢? - Paco
我不是在评判什么,我只是问一下,因为很可能原帖作者正在朝着错误的解决方案前进。也许可以找到更简单的解决方案来解决他/她特定的问题。 - Mauricio Scheffer
@Paco是正确的。最常见的情况之一是构建一个模块化应用程序,其中每个模块都可以订阅映射引擎以更改一些公共实体映射。如果您查看一些最常见的“非类型安全”cms工具,大多数是用php或python编写的,例如Django和Pyramid,您会发现这种“不好”的设计方法是它们数据访问层的核心。Nhibernate或hibernate主要是静态映射ORM工具,而C#仍然是一种相对静态的编程语言,不会验证或无效化设计决策。 - Cagatay Kalan
1个回答

0

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


@Mauricio:更改数据库不是一个选项。然而,现在我明白了,我从错误的角度(就关系数据库而言)来看待这个问题。我想出了一个“更方便”的架构,但它并不是该问题领域的“真正架构”。感谢你的指导澄清。 :) - Arie Ori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接