Entity Framework 数据库优先模式下的枚举支持

16

我可以找到许多有关如何为模型优先和代码优先实现枚举支持的教程,例如:

http://msdn.microsoft.com/en-us/data/jj248772.aspx

http://msdn.microsoft.com/en-us/data/hh859576.aspx

有人能向我解释或提供一些指导,告诉我如何正确地为数据库优先应用程序实现枚举支持吗?我想我需要从edmx设计器开始,在表格中右键单击其中一个列并转换为枚举类型?感谢任何建议。我正在使用.NET 4.5和Enity Framework 5.0。


顺便提一下,您可以使用Code First针对现有的数据库进行操作。http://msdn.microsoft.com/en-us/data/jj200620 - phil soady
将数据库中的表示以数字为基础,如使用 short,然后创建一个带有隐式数字的枚举类型,例如 public enum Gender : short { NotSet = 0, MALE = 1, FEMALE = 2 },并在实体字段上添加属性 [EnumDataType(typeof(short))] - Jaider
3个回答

14

我最终做的是将数据库中该列的类型更改为int,然后进入edmx并从数据库更新模型,接着我添加了一个枚举类型,然后在edmx设计器中将该列的类型更改为该枚举类型。重新更新Poco(实体类对象),一切都很好!


我处于类似的情况中,非常希望能够了解您是如何解决这个问题的更多细节。我在数据库中有一个存储“类型”的表格,它有两列:ID和TypeName。假设您的情况下也有类似的表格,那么您在数据库中具体做了哪些更改?然后,当您说您向edmx添加了一个枚举类型时,当数据库发生更改时,您如何保持其与数据库的同步更新? - Kappacake
是的,也许当时情况不同,但是当我尝试这样做时,属性的可用类型会显示为下拉列表,而我的枚举类型并不在其中(我的任何自定义类型都不在)。 - xr280xr
如果你到这里并且想知道如何做,EF Designer 中右键单击属性时会出现一个名为“转换为枚举”的上下文菜单项。以下是来自 Microsoft 的屏幕截图:https://learn.microsoft.com/ef/ef6/modeling/designer/data-types/enums#add-an-enum-type 所以这实际上非常容易。对话框会为您创建枚举。生成的文件将与其他实体一起结束。 - BenderBoy

12

您可能还应该阅读此文

枚举类型不是通过数据库优先操作在模型中创建的

  • 当您从现有数据库创建EDM时,枚举未在模型中定义。
  • 从数据库更新模型将保留您声明的枚举类型,但同样不会检测到来自数据库的Enum结构。

我见过一些解决方案使用T4,但在我的具体情况下,它只是为我的项目增加了不必要的复杂性。因此,我会屈服于代码优先的枚举。


4
我同意没有必要增加复杂性。我的模型中有很多枚举,每当表被删除/重新添加时重新配置类型真的很烦人,特别是当你的枚举类型是外部的时候。我也在“屈服”,使用编码优先的枚举。也许在未来我们会有更好的数据库优先的枚举支持。 - jamesSampica
从数据库更新模型并不总是保留枚举。幸运的是,编译器应该会在设计师将枚举声明替换为整数时进行捕捉。是的,这是一个“当”,而不是“如果”。 - Suncat2000

4

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