【问题标题】:Entity Framework 5 Enum that is built from a db table从 db 表构建的实体框架 5 枚举
【发布时间】:2013-05-24 00:22:39
【问题描述】:

我有这两个实体:

颜色实体映射到表示颜色的常量值表。
代码=1,名称=“红色”
代码=2,名称="蓝色"
等等……

在 Car 实体中,Color 属性是 int 类型,并且对 Color 实体中的 Code 属性具有外键约束。我想将 Car 中的 Color 属性转换为 Enum,但 Enum 应该从 Color 表中获取它的值。

可以在每个构建操作或设计器中的“更新模型”操作中更新枚举。 能不能实现这个功能?

【问题讨论】:

  • 您可能会编写一个 T4 模板(*.tt 文件)来连接到数据库并输出生成的枚举,然后使用扩展在每次构建之前执行您的模板。诸如 Chirpy 或 Web Workbench afaicr 之类的工具可以做到这一点,但也可能存在其他选项(在 NuGet 中搜索选项)。但我不确定这样做是否有意义,因为您无法在代码中的任何位置安全地使用枚举(假设值可能会更改或消失)。
  • 我们已经实现了一个从数据库表生成枚举的 T4 模板。效果很好。

标签: c# entity-framework enums entity-framework-5


【解决方案1】:

" 但枚举应该从颜色表中获取它的值。"

那么你有什么问题呢?反正既然你问... 枚举定义在程序集中。因此,一旦将新颜色添加到表中,您就会拥有一个过时的枚举。但是,如果您可以在构建时保持最新状态。有一个不错的选择。

显然使用 T4 的建议很有趣。但是 t4 需要连接到 DB 并读取它。当 T4 超越源代码生成时,使用简单的应用程序会更容易。当然,除非你已经擅长 t4。因此,如果 t4 对这项任务有点困难,请尝试:

一个简单的辅助应用程序,读取数据库并更新 EnumColor.cs 是合理的。

IE 一个简单的控制台应用程序。放置作为预构建步骤。 pre-build 读取数据库,重写 enum.cs 文件,然后进行编译/构建。

**简单的选择:使用可以在运行时扩展的字典**

Dictionary<int,string> colors

【讨论】:

  • 此解决方案可行。但是您是说每次我需要添加新颜色时,我都可以将它添加到数据库中的表中并更新枚举代码。这是一个好习惯吗?
  • 不只是表格。简单的程序会读取表格,创建/覆盖简单的 ColorEnum 文件,然后进行编译。当然,您仍然需要触发 Build。
【解决方案2】:

对我来说,第一个问题是为什么?我有类似的技术需求,但业务需求是帮助报告。枚举可以很好地使代码更易于阅读和维护,但是您是否必须在 SSRS 中创建一个报告,然后您就无法访问枚举(好吧,我相信一些高级 SSRS 用户会说您可以在程序集中进行链接等, 但这不是重点)。我们使用了一个预构建脚本(也可以运行构建后)来生成内联缩放器函数脚本以针对 db 执行。这样您就可以执行以下选择语句:

SELECT Model, fColorNameEnum(Color) FROM Car

这样,如果您在枚举中添加新元素,您就不必再次触摸您的报告。我倾向于在业务逻辑的实现中使用枚举,通常是项目状态或工作流状态。因此,添加新选项需要添加新逻辑,这意味着在代码中进行。如果您永远不会对代码中的颜色值进行推理,那么要将其放入枚举而不是另一个链接对象的原因是什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多