27

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

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

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

OtherNamespace.MyEnum被我的项目引用。

你怎么做呢?

4

1 回答 1

53

这是可以做到的,但是需要在数据库方面做出一点牺牲。实体框架(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 中为枚举指定名称,为枚举定义任何值或通过Reference external type链接到外部枚举。

给它一个 Type Name TitleEnum,检查Reference external type,然后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();

智能感知

于 2013-10-07T17:04:27.200 回答