如何在entity framework代码中首先映射不同数据类型的列和实体

我正在使用Entity Framework 5 – Code。

我有一个数据库,我连接到已经存在一段时间了(我没有创建它)。 有一个名为T_Customers的表。 它包含所有客户的列表。 它具有以下结构(仅部分显示):

 Customer_id | numeric (5, 0) | auto increment | not null (not set as primary key) FName | varchar(50) | not null LName | varchar(50) | not null 

我的Customer类:

 public class Customer : IEntity { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 

我的IEntity界面:

 public interface IEntity { int Id { get; set; } } 

我的数据库上下文类中有以下内容:

 public class DatabaseContext : DbContext { public DatabaseContext(string connectionString) : base(connectionString) { } public DbSet Customers { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new CustomerConfiguration()); } public new DbSet Set() where TEntity : class, IEntity { return base.Set(); } } 

我的客户配置类:

 class CustomerConfiguration : EntityTypeConfiguration { internal CustomerConfiguration() { this.ToTable("T_Customers"); this.Property(x => x.Id).HasColumnName("Customer_id"); this.Property(x => x.FirstName).HasColumnName("FName"); this.Property(x => x.LastName).HasColumnName("LName"); } } 

我试图在我的实体声明中保持一致,我需要所有的ID都是整数。 此客户ID在数据库中的类型为numeric,现在我在尝试返回所有客户的列表时遇到问题。 如何从数据库数字类型映射到C#整数类型? 我没有将我的类ID改为可空或十进制,我的ID总是不可为空和整数。 我也无法更改数据库。

我得到的错误是:

 The 'Id' property on 'Customer' could not be set to a 'Decimal' value. You must set this property to a non-null value of type 'Int32'. 

为列指定数字类型

 Property(x => x.Id).HasColumnName("Customer_id").HasColumnType("numeric"); 

生成数据库时,它将创建精度为18,0数字列。 但是当您映射到现有数据库时,它将与5,0数字列一起正常工作。

最简单的解决方案是使用另一个将映射到数据库字段的字段,ID属性将读/写此字段。 像这样的东西:

 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; } } 

使用,将此新字段映射到数据库字段

 this.Property(x => x.CustomerID).HasColumnName("Customer_id"); 

并且EF将使用客户ID字段,您的代码可以愉快地使用整数id字段。

解决代码首要问题的另一个选择是MS EF Powertools http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

您可以先从DB添加一个空项目,右击,EF反向工程师代码。

您经常(并非总是)为解决方案提供良好的开端。 你尝试过使用小数吗?

 public class Customer : IEntity { public decimal Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 

如果您关注精度,则应该向POCO添加validation。

你可能也喜欢一些有趣的Anotation黑客攻击。 http://geekswithblogs.net/danemorgridge/archive/2010/12/20/ef4-code-first-control-unicode-and-decimal-precision-scale-with.aspx祝你好运

您可以使用以下命令将其转换为int:

  int myInt = Convert.Int32(numberFromDatabase);