如何第一映射实体框架代码柱和不同数​​据类型的实体属性格式(How to map column an

2019-07-19 17:55发布

第一码 - 我使用实体框架5。

我有我连接到一个数据库已经存在有一段时间了(我没有创建它)。 有一种称为表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<Customer> Customers { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          modelBuilder.Configurations.Add(new CustomerConfiguration());
     }

     public new DbSet<TEntity> Set<TEntity>()
          where TEntity : class, IEntity
     {
          return base.Set<TEntity>();
     }
}

我的客户配置类:

class CustomerConfiguration : EntityTypeConfiguration<Customer>
{
     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是在数据库中数值型,并试图返回所有的客户列表时,现在我遇到的问题。 如何从数据库数值类型到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'.

Answer 1:

指定数值类型列

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

当生成数据库,它会创建一个精确数字列18,0 。 但是,当你映射到现有的数据库,它会正常工作与5,0数字列。



Answer 2:

最简单的解决方案是使用将被映射到数据库字段另一字段,并且该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字段。



Answer 3:

制定出代码首先应该是什么样的另一个选择是到MS EF电动工具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。

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



Answer 4:

你可以将其转换为与一个int:

 int myInt = Convert.Int32(numberFromDatabase);


文章来源: How to map column and entity propery of different datatypes in entity framework code first