【发布时间】:2013-02-22 08:19:28
【问题描述】:
我将实体框架用于一个相当简单的问题跟踪应用程序。 我想通过添加其他属性为用户提供扩展“问题”实体的能力,例如:
- 数字字段
- 文本字段(简单或富文本)
- 不同的列表(多选\单选)
- 布尔属性
我想到了两种方法来完成任务:
可扩展的数据库方法
这种方法只是想法,我不知道如何使用实体框架来实现,所以我非常希望得到你的帮助。 这是基本概念:
- 创建一个名为 IssueExtendedFields 的表,该表将为每个字段提供一条记录,描述其类型和名称,可能还有其他属性。
- 创建另一个名为 IssueFieldOptions 的表,其中包含每个“列表类型字段”的选项列表
- 最后一个表名为 IssueExtendedFieldValues,它将为用户创建的每个自定义字段保存一个具有特定命名约定的列,并为每个问题保存一个外键。..
现在我只是不知道如何实现第三步,因为使用实体框架并且有从表中生成的 EF 实体对象(首先是 DB),因此理论上每个新列都必须重新映射和重新编译 DAL 项目。
您还有其他建议吗?
字典法
这个方法我知道怎么实现
- 创建一个名为 IssueExtendedFields 的表,该表将为每个字段提供一条记录,描述其类型和名称,可能还有其他属性。
- 创建另一个名为 IssueFieldOptions 的表,其中包含每个“列表类型字段”的选项列表
- 最后一个名为 IssueExtendedFieldValues 的表将保存输入到系统中的每个“字段 - 值”对的记录
但它有许多缺点(如果你知道如何克服它们,请发布)。
- 用户添加的每个新属性都只是另一条记录,它将为每个实体存储的数据量乘以 X,其中 X 是属性的数量,我看到大量问题进入系统并创建一个单独的表来保存每个问题多 10 条记录将生成需要大量内存的大量查询。
- 除了可预见的内存问题之外,我还必须创建动态“数据透视”(如报告和视图),以允许用户再次生成自定义属性报告,并且当您处理大量数据时,“数据透视”查询将占用更多时间。
【问题讨论】:
标签: entity-framework design-patterns dynamic-data