I am using Entity Framework 5 - Code first.
I have a database that I am connecting to that already exists for some time now (I did not create it). There is a table
The simplest solution is to use another field that will be mapped to the database field, and the ID property will read/write to this field. Something like this:
public class Customer : IEntity
{
public decimal CustomerID {get; set;}
[NotMapped]
public int Id
{
get { return (int)CustomerID; }
set { CustomerID = (int)value; }
}
public string FirstName { get; set; }
public string LastName { get; set; }
}
Map this new field to the database field, using
this.Property(x => x.CustomerID).HasColumnName("Customer_id");
and the EF will use the customer id field, and your code could happily use the integer id field.
Specify numeric type for column
Property(x => x.Id).HasColumnName("Customer_id").HasColumnType("numeric");
When generating database, it will create numeric column with precision 18,0
. But when you are mapping to existing database, it will work fine with 5,0
numeric column.
In .Net Core you can also use System.ComponentModel.DataAnnotations.Schema.ColumnAttribute to annotate the property with the underlying column type, e.g.,
[Column(TypeName = "numeric(5, 0), not null")]
public int Id { get; set; }
Or if the column is nullable:
[Column(TypeName = "numeric(5, 0), null")]
public int? Id { get; set; }
I prefer this to the accepted answer by @Sergey Berezovskiy, as you make the annotation actually on the model, not in elsewhere (in the DbContext).
The ColumnAttribute can also be used to map a property to a column with a different name, e.g.,
[Column("Identifier", TypeName = "numeric(5, 0), not null")]
public int Id { get; set; }
The ColumnAttribute may also work in the .Net Framework - I have not tested it.
Another option to work out what the code first should be is to the MS EF Powertools http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d
You can add an empty project, right click, EF Reverse engineer code first from DB.
You often (not always) get a good start to the solution. Did you try using decimal?
public class Customer : IEntity
{
public decimal Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
if you are concerned precision, you should add validation to the POCO.
There are also some interesting Anotation hacks you may like. http://geekswithblogs.net/danemorgridge/archive/2010/12/20/ef4-code-first-control-unicode-and-decimal-precision-scale-with.aspx good luck
You can convert it to an int with:
int myInt = Convert.Int32(numberFromDatabase);