有没有一种方法可以在C#中动态生成枚举?

4

我的应用程序中有两个表。

tblEvents

  • 事件ID
  • 用户ID
  • 日期
  • 事件类型

tblEventTypes

  • 事件类型ID
  • 事件名称

tblEvents包含了应用程序中发生的事件日志。在将事件添加到日志时,其中一个必需的列是事件类型。事件类型必须是存储在tblEventTypes中的事件类型ID。

在我的应用程序中,使用Entity Framework创建了一个函数导入来添加事件到tblEvents的存储过程。目前,我通过函数导入创建的方法传递一个整数作为事件类型。对我来说,这似乎不可读,因为你无法知道整数代表什么事件类型,除非查看数据库,找到事件类型表,并查看它是哪个事件。

我想创建一个枚举来表示事件类型。是否有一种方法可以创建一个基于tblEventTypes数据生成的动态枚举?就像EF根据数据库中的表生成实体一样,我想基于表和其当前数据生成一个枚举。因此,添加事件类型只需要向tblEventTypes添加一行,然后运行EF设计器中的更新或其他操作,即可自动更新代码中的枚举。

2个回答

3
你不能使用EF设计器来完成这个操作,但你可以使用T4模板来生成枚举。

嗯,我从没想过那个。有趣。我对T4模板还很陌生。 - Chev
这正是我想要的。如果EF本身能够做到这一点就更好了。 - Chev

1

我遇到过这种情况很多次,我的决定总是明确定义事件类型,并为每个条目创建一个枚举,例如...

Public enum EventType
{
     Info = 100,
     Error = 200
 }

我会创建一个数据库脚本,将项目创建到数据库中,并手动保持同步。

我无法想象将它们用作动态类型的意义,因为您只会以显式方式使用它们(例如记录某种类型的事件)。

据我所知,EF不支持实体记录建模,仅支持模式。


没错,我的想法是让枚举变得明确,每当我执行“更新模型”操作时,它就会根据数据库中的数据自动生成。我希望EF能够支持枚举,那将非常酷。 - Chev
是的,当您插入一条记录时,您会写类似于 myEntity.EventTypeId = (int)EventType.Info; 的代码。 - Baldy
是的,我知道我可以手动创建枚举。我只是想象一下像 EF 目前使用数据库模式生成代码一样,只不过这将实际读取表中的记录以创建枚举。 - Chev
当他们最终将Code-First作为一种受人尊敬的设计选择时,我会更加兴奋。然后,您可以反过来生成一个在代码中的枚举DB表,并与使用它的表建立关系。那将是非常出色的! - Chev
这在 EF 中是不可能的,Alex。我们仍然需要手动管理模型记录,但是如果可以实现那就太好了! - Baldy
1
微软刚发布了EntityFramework 4.2的CTP版本,支持枚举映射,这是一种进步。不过我认为它并不会根据值实际创建数据(但我可能错了,因为还没有使用过)。 - jlew

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