【问题标题】:How to use an existing enum with Entity Framework DB First如何将现有枚举与 Entity Framework DB First 一起使用
【发布时间】:2017-07-04 07:06:48
【问题描述】:

我首先使用的是实体框架 5,DB。我知道如何在我的模型上定义一个枚举,并将字段的类型设置为该枚举。

现在,我需要将字段 MyField 映射到外部定义的枚举,即不在 EF 模型 (OtherNamespace.MyEnum) 中。设计师不允许我将类型设置为模型之外的任何内容。我尝试手动编辑 edmx 文件,但这会导致错误:

错误 10016:解析项目“MyField”时出错。异常消息是:'未解析的引用'OtherNamespace.MyEnum'。'。

OtherNamespace.MyEnum 被我的项目引用。

你是怎么做到的?

【问题讨论】:

  • 你必须做一些额外的逻辑才能得到它,你可以把它放在 setter 中。
  • @Dunbar 你是什么意思?你能说得更具体点吗?
  • 就像在属性设置器中一样,让它设置你真正想要设置的对象的非映射实例。
  • @Dunbar 可以在本地代码中使用,但不能在 IQueryable<MyClass> 中使用,例如db.MyClasses.Where(x => x.MyField == OtherNamespace.MyEnum.Value2)
  • 你正在实现的枚举是否对每个枚举值都有已知的整数表示?

标签: c# entity-framework-5 ef-database-first


【解决方案1】:

这可以做到,但需要在数据库方面做出一点牺牲。实体框架(5 起)支持将字段映射到枚举,但仅适用于 bytesbyteshortushortintuintlongulong 类型.

假设我们有以下示例表:

CREATE TABLE [People](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Name] [varchar](50) NOT NULL,
    [Title] [int] NOT NULL
)

Title 已被声明为整数。在真实数据库中,这可能是TitleTypes 表的外键。

另外,假设我们要绑定的外部枚举定义为:

namespace Enumerations
{
    public enum TitleEnum
    {
        Mr,
        Mrs,
        Dr,
        None
    }
}

如果我们将People 表导入EDMX,我们可以右键单击Title 列并转换为枚举

这将打开一个对话框,允许我们在 EDMX ModelStore 中为枚举指定名称,为枚举定义任何值通过引用外部类型链接到外部枚举

给它一个类型名称TitleEnum,检查引用外部类型,并在提供的字段中输入Enumerations.TitleEnum。单击确定,它将将该列与外部枚举相关联。

注意:

  • 虽然两者都称为 TitleEnum,但这是作为外部枚举的传递
  • 列的类型和外部枚举必须匹配

现在,当我们创建一个新人时,我们可以利用枚举并将其转换为它的 Int 表示。

Data.ScratchEntities context = new Data.ScratchEntities();
Data.Person person = new Data.Person();
person.Name = "Jane Smith";
//Note the use of the external enumeration here
person.Title = Enumerations.TitleEnum.Mrs;
context.People.Add(person);
context.SaveChanges();

【讨论】:

  • 感谢您提供精美的答案。但这对我不起作用。一切都很好,直到最后一步 - 但我收到编译器错误:无法将源类型 Enumerations.TitleEnum 转换为目标类型 MyNamespace.TitleEnum。我究竟做错了什么?难道是因为我的基本类型是byte 而不是int
  • 是的。列的类型和枚举的基本类型需要匹配,以便它可以进行从一个到另一个的隐式转换。
  • db中的列是tinyint,映射到byte...?如果是这样的话,显式转换应该可以工作 - 但它没有。
  • 据我所知,将枚举映射到枚举时,无法在设置值时显式转换类型。但是,在这种情况下起作用的是将该字段的 EF 类型定义保留为 byte,并且当您从枚举中设置值时,将枚举值转换为适当的类型:td.Title = (byte)Enumerations.TitleEnum.Mr;
  • 在EDMX中转换为枚举时,是否指定了外部枚举?尝试复制您的错误,当我删除参考时,我会收到您在上面第一条评论中提到的确切错误消息。您可以通过 Enum Types 下的 Model Browser 编辑现有的枚举映射(抱歉,我花了一个小时才到达那里,还没有喝咖啡)
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多