This can be done, but it requires a little sacrifice on the database side. Entity Framework (5 onwards) supports mapping a field to an enumeration, but only for byte
, sbyte
, short
, ushort
, int
, uint
, long
, or ulong
types.
Assume that we have the following sample table:
CREATE TABLE [People](
[id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [varchar](50) NOT NULL,
[Title] [int] NOT NULL
)
Title
has been declared as an integer. In a real database, this might be a foreign key over to a TitleTypes
table.
Also, let's assume that the external enumeration that we are going to be tying into is defined as:
namespace Enumerations
{
public enum TitleEnum
{
Mr,
Mrs,
Dr,
None
}
}
If we import the People
table into an EDMX we can right click on the Title
column and Convert to Enum
This will bring up a dialog box allowing us to specify a name for the enumeration in the EDMX ModelStore, define any values for the enumeration OR link to an external enumeration via Reference external type.
Give it a Type Name of TitleEnum
, check Reference external type, and type Enumerations.TitleEnum
in the provided field. Click OK and it will associate the column to the external enumeration.
Note:
- While both are called TitleEnum, this is acting as a passthrough to the external Enumeration
- The type of your column and the external enumeration MUST match
Now, when we create a new person we can utilize the enumeration and it will be translated into its Int representation.
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();
IQueryable<MyClass>
e.g.db.MyClasses.Where(x => x.MyField == OtherNamespace.MyEnum.Value2)
– Wellbeing