Wednesday, June 13, 2012

Using Decimal as Primary key in Entity Framework 4

Entity Framework 4 does some automatic things which is very useful in many scenarios. For example, if we declare a “ID” property for a class, it automatically assumes that property as a primary key for the mapped table in the database. And It also sets the “identity” property of the column to true.

 

int_identity

Figure: Simple model with “integer” type Primary key

 

This works very good in most of the time. Unfortunately, sometimes we may need to use “decimal” data type rather than “integer”, specially for large table.

 

decimal

If we want to see the same behavior for decimal that we have seen for integer before (for example, set primary key and identity property), we need to do some extra configurations:

1. Explicitly add the “DatabaseGenerated” attribute to set the “identity” value of the column in database.

[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]

2. Specify the precision for the decimal data type. This is because by default it assumes there are two numbers after the decimal for decimal data type. We need to set it 0.

modelBuilder.Entity<User>().Property(x => x.ID).HasPrecision(16, 0);

 

That’s it. Lets see the full view after updating the classes-

user-full

Figure: User class after adding the attribute

 

dbcontext

Figure: Set precision for ID

Now add users in the database through the application. “ID” will be automatically increment by 1 like the integer before.

 

Happy programming!

2 comments:

Anonymous said...

this is fixed in entity framework v5

Ehsan said...

Thanks for notifying us :-)