本节咱们只介绍在EF中比较常见的映射数据库
默认状况下能够不配置表名,咱们的模型名称将会做为数据库的表名。可是大部分项目会要求数据库表名称的规范,例如咱们要将模型 User 在数据库中映射为 Users,那么咱们能够这么作,在派生类上下文中的 OnModelCreating 中进行以下定义:ui
modelBuilder.Entity<User>().ToTbale("Users");
表的主键咱们通常习惯使用 Id 或者以 Id 结尾的方式来命名,EF默认状况下会将 Id 或以 Id 结尾的属性做为主键,若是二者都存在的话,默认会以 Id 做为主键。可是,还存在以下几种状况:code
针对上面两种状况,咱们分别进行以下配置:ci
//设置联合主键 modelBuilder.Entity<User>().HasKey(k => new { Id=k.Id, UserId=k.UserId }); //手动分配主键值 modelBuilder.Entity<User>().HasKey(k => k.Id).Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
DatabaseGeneratedOption 是枚举类型,值以下:字符串
值 | 说明 |
---|---|
Identity | 标识列 |
Computed | 计算列 |
None | 手动分配值 |
数据库中的数值类型有不少种,C#中也有不少数值类型,可是咱们没法直接将C#中的数值类型转换为数据库中的数值类型。那么怎么将C#数值类型映射为数据库数值类型呢?这里咱们以 C# float 为例,来看一下代码:string
modelBuilder.Entity<User>().Property(p=>p.Float);
经过上面的代码,咱们将 C# float 类型映射为了数据库的 real 类型。下表是C#数值类型对应的数据库的数值类型:it
C#数值类型 | 数据库数值类型 |
---|---|
int | int |
double | float |
float | real |
decimal | decimal(18,2) |
Int64 | bigint |
咱们看到上表中有一个C#数值类型 decimal 对应的数据库数值类型是 decimal(18,2) ,括号中的2表明小数点后保留2位,可是在一些状况下咱们须要保留小数点后面N位,这时咱们能够这么作:io
modelBuilder.Entity<User>().Property(p=>p.Money).HasPrecision(18,4);
当咱们未对string类型的属性配置映射时,默认的数据库类型是 nvarchar(max),可是大部分状况下不会使用这个默认的映射。举几个例子来说解一下怎么来改变这个默认映射。table
//设置Name属性在数据库映射不可为空 modelBuilder.Entity<User>().Property(p=>p.Name).IsRequired();
//设置Birthday属性在数据库映射可为空 modelBuilder.Entity<User>().Property(p=>p.Birthday).IsOptional();
EF中的日期类型在数据库中默认映射为Date,可是数据库中的日期类型还有不少,而且有时候咱们须要将日期类型映射为数据库其余类型,那么咱们该怎么作呢?这里咱们以映射为 DateTime 为例:class
modelBuilder.Entity<User>().Property(p=>p.CreateDateTime).HasColumnType("DATETIME");
注:数值类型和日期类型属于值类型,所以咱们不须要经过 IsRequired 来配置映射字段不可为空,由于默认就是不为空的。可是能够经过 IsOptional 设置可为空。