I am using Entity Framework 5, DB first. I know how to define an enum on my model, and set the type of a field to that enum.
Now, I have a requirement to map a field MyField
to an enum that is defined externally, i.e. not in the EF model (OtherNamespace.MyEnum
). The designer does not allow me to set the type to anything outside the model. I tried editing the edmx file manually, but that causes an error:
Error 10016: Error resolving item 'MyField'. The exception message is: 'Unresolved reference 'OtherNamespace.MyEnum'.'.
OtherNamespace.MyEnum
is referenced by my project.
How do you do it?
In Entity Framework, this feature will allow you to define a property on a domain class that is an enum type and map it to a database column of an integer type. Entity Framework will then convert the database value to and from the relevant enum as it queries and saves data.
We can convert an enum to string by calling the ToString() method of an Enum.
No, it can't as this would mean that you would be able to modify existing types at runtime which you can't.
By default, when an enum is a part of an entity, JPA maps its values into numbers using the ordinal() method. What it means is that without customizations JPA stores enum value as numbers. These numbers are associated with the order in which you define values in the enum.
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:
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With