Это можно сделать, но для этого потребуется немного пожертвовать со стороны базы данных. 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.
Это вызовет диалоговое окно, позволяющее нам указать имя для перечисления в EDMX ModelStore, определить любые значения для перечисления ИЛИ связать с внешним перечислением через Внешний тип ссылки.
Присвойте ему имя типа TitleEnum
, установите флажок Ссылка на внешний тип и введите Enumerations.TitleEnum
в соответствующем поле. Нажмите OK, и он свяжет столбец с внешним перечислением.
Примечание.
- Хотя оба называются 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();
person
cbeckner
schedule
07.10.2013
IQueryable<MyClass>
, например.db.MyClasses.Where(x => x.MyField == OtherNamespace.MyEnum.Value2)
- person Shaul Behr   schedule 01.10.2013