2013-10-01 4 views
26

Я сначала использую Entity Framework 5, DB. Я знаю, как определить перечисление на моей модели и задать тип поля для этого перечисления.Как использовать существующее перечисление с Entity Framework DB Сначала

Теперь у меня есть требование отобразить поле MyField на перечисление, которое определено извне, то есть не в модели EF (OtherNamespace.MyEnum). Дизайнер не позволяет мне устанавливать тип на что-либо вне модели. Я попытался отредактировать файл EDMX вручную, но это приводит к ошибке:

Error 10016: Error resolving item 'MyField'. The exception message is: 'Unresolved reference 'OtherNamespace.MyEnum'.'.

OtherNamespace.MyEnum ссылается мой проект.

Как вы это делаете?

+0

Ваш придется сделать некоторые дополнительные логики, чтобы получить, что вы могли бы положить, что в инкубаторе. – Botonomous

+0

@ Дунбар, что вы имеете в виду? Можете быть более конкретными? –

+0

Как и в настройщике свойств, задайте ли он не отображаемый экземпляр объекта, который вы действительно хотите установить. – Botonomous

ответ

52

Это можно сделать, но это требует небольшой жертвы на стороне базы данных. Entity Framework (5 и далее) поддерживает отображение поля для перечисления, но только для byte, sbyte, short, ushort, int, uint, long или ulong типов.

Предположим, что мы имеем следующий пример таблицы:

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 колонки и Преобразовать в ENUM

Convert To Enum

Это вызовет диалоговое окно, что позволяет нам указать имя для перечисления в т он EDMX ModelStore, определить любые значения для перечисления ИЛИ ссылка на внешнее перечисление через Ссылка внешнего типа.

Дайте ему название типа TitleEnum, отметьте Ссылка внешнего типа и введите Enumerations.TitleEnum в соответствующем поле. Нажмите «ОК», и он свяжет столбец с внешним перечислением.

Примечание:

  • Хотя оба называется TitleEnum, это действует как проходные к внешнему Перечислению
  • Тип вашей колонки и внешнее перечисление должно соответствовать

Linking the Enumeration

Теперь, когда мы создаем нового человека, мы можем использовать перечисление, и оно будет переведено в его представление 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(); 

Intellisense

+1

Спасибо за красиво оформленный ответ. Но это не работает для меня. Все в порядке до последнего шага - но я получаю ошибку компилятора: невозможно преобразовать исходный тип 'Enumerations.TitleEnum' в целевой тип' MyNamespace.TitleEnum'. Что я делаю не так? Может быть, потому, что мой базовый тип - 'byte', а не' int'? –

+1

Да. Тип столбца и базовый тип для перечисления должны совпадать, чтобы он мог выполнять неявное преобразование из одного в другое. – cbeckner

+1

Столбец в db является tinyint, который отображает байты ...? И если это так, явное действие должно работать, но это не так. –

Смежные вопросы