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