Подтвердить что ты не робот

Как использовать существующее перечисление с базой данных Entity Framework

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

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

Ошибка 10016: ошибка, разрешающая элемент "MyField". Сообщение об исключении: 'Unresolved reference' OtherNamespace.MyEnum '.'.

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

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

4b9b3361

Ответ 1

Это можно сделать, но это требует небольшой жертвы на стороне базы данных. 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, определить любые значения для перечисления OR для внешнего перечисления с помощью Reference external type.. p >

Дайте ему имя типа 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