【问题标题】:Entity Framework 5 Enum Naming实体框架 5 枚举命名
【发布时间】:2012-04-13 17:03:31
【问题描述】:

我首先使用带有迁移和代码的 EF 5。这一切都很好,但有一些问题/问题我想解决。

让我们从一个简单的例子开始。假设我有一个用户表和一个用户类型表。用户类型表是我的应用程序中的枚举/查找表。所以用户表有一个 UserTypeId 列和一个外键 ref 等到 UserType。在我的 poco 中,我有一个名为 UserType 的属性,它具有枚举类型。

要将初始值添加到 UserType 表(或稍后添加/更改值)并在初始迁移器等中创建表。我需要一个 UserType 表 poco 来表示数据库中的实际表并在地图文件。我将 User poco 中的 UserType 属性映射到 UserType poco 中的 UserTypeId。所以现在我有一个用于代码优先/迁移/上下文映射等的 poco,并且我有一个枚举。两者不能有相同的名称,所以我是否有一个名为 UserType 的 poco 和其他用于枚举的名称,或者 UserType 的 poco 是 UserTypeTable 之类的?

然而,更重要的是,我是否遗漏了代码首先如何工作的一些关键元素?我尝试了上面的示例,运行了 Add-Migration,但它没有为枚举添加查找表。

【问题讨论】:

标签: c# enums .net-4.5 entity-framework-5


【解决方案1】:

如果我正确理解了您的问题和您的困惑,

Enums support has nothing to do with lookup tables on the Db side.  

枚举只是允许您在类中拥有 Enum-s 的属性,并且基本上被转换为“int”-s - 所以那里没有什么其他东西。

有关更多信息,您可能想观看来自Julie Lerman on Enum-s support 的视频

希望对你有帮助

【讨论】:

  • 我想他是说他有一个字段 UserTypeId 他想映射到一个枚举(比如说UserTypeEnum)和作为他查找表的类的外键(比如说@ 987654326@).
  • 是的,布莱恩,没错。我试图找出正确的组合,让代码首先是干净的(使用枚举),但仍然创建/连接到数据库中的查找表。我知道枚举支持仅在代码方面,但实际上您仍然需要一个查找表来确保数据库中的有效值。目前在工作中,我们有一个生成器,它从查找表中生成枚举(包括带有描述的 EnumMember 属性)。如果您首先将 DB 与模型一起使用,则可以将列设置为 enum 类型,它会从 DB 为您创建枚举。
  • @TyrelVanNiekerk 我理解 - 我认为你可以让两者一起工作(它类似于自定义映射 FK-s 等)。但是您能否仅指定您想要实现的确切目标(例如,具有枚举 + ID 是查找表和类的 FK - 但是我认为,除了枚举之外,您还必须有一个查找类 - 或者您只是想要“不可见”的查找表等),我将使用特定的解决方案编辑问题。
  • @NSGaga 我最终修改了生成的迁移器代码。默认情况下,它最终想要创建一个 UserTypeLookup_UserTypeId 列和 FK,而不是使用 UserTypeId。我确实必须同时创建枚举和查找类以满足代码优先/映射/迁移器代码。
  • 是的,听起来你肯定需要我的(无耻插件)ef-enum-to-lookup nuget 包 - stackoverflow.com/a/26528355/10245 / nuget.org/packages/ef-enum-to-lookup
【解决方案2】:

根据我的经验,枚举对您的代码来说比查找类更重要,因此请给它一个正确的名称。我还将保持查找类与我的模型中的用户没有任何关系。如果它真的只是用于查找,那么你不需要它挂在你的用户身上。带有DescriptionAttribute 的枚举可以完成代码中的查找。

UserTypeLookup 可能是一个好名字,因为这听起来就像你将使用它的目的。然后您可以使用该类来维护表。

假设您没有首先在 ef 代码中映射 UserTypeLookupUser 之间的关系,那么您唯一需要在数据库中手动创建的是 @ 中的 UserType 列之间的外键关系987654326@ 表和来自UserTypeLookup 表的PK。 UserTypeLookup 仍然可以是一个实体,即使您没有为其设置任何关系,EF 仍应为其生成数据库表。

【讨论】:

  • 同意。正如你所说,我实际上已经命名了我的查找类。我现在要解决的问题是,因为我将 poco 设置为使用枚举和映射代码以使用查找,迁移器将其视为更改并尝试通过添加名为“UserTypeLookup”的列来修改数据库”。我希望在数据库中进行查找我可能不得不求助于在迁移器代码中手动创建表等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多