Entity Framewor简单属性映射

简介: Entity Framewor简单属性映射

本节我们只介绍在EF中比较常见的映射


零、表名映射


默认情况下可以不配置表名,我们的模型名称将会作为数据库的表名。但是大部分项目会要求数据库表名称的规范,例如我们要将模型 User 在数据库中映射为 Users,那么我们可以这么做,在派生类上下文中的 OnModelCreating 中进行如下定义:

modelBuilder.Entity<User>().ToTbale("Users");

一、主键映射


表的主键我们一般习惯使用 Id 或者以 Id 结尾的方式来命名,EF默认情况下会将 Id 或以 Id 结尾的属性作为主键,如果两者都存在的话,默认会以 Id 作为主键。但是,还存在如下几种情况:


  1. 设置联合主键;
  2. 主键为 int 类型,但是不是自增长的,而是手动分配的。


针对上面两种情况,我们分别进行如下配置:

//设置联合主键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 是枚举类型,值如下:

image.png

二、数值映射

数据库中的数值类型有很多种,C#中也有很多数值类型,但是我们无法直接将C#中的数值类型转换为数据库中的数值类型。那么怎么将C#数值类型映射为数据库数值类型呢?这里我们以 C# float 为例,来看一下代码:

modelBuilder.Entity<User>().Property(p=>p.Float);

通过上面的代码,我们将 C# float 类型映射为了数据库的 real 类型。下表是C#数值类型对应的数据库的数值类型:

image.png

我们看到上表中有一个C#数值类型 decimal 对应的数据库数值类型是 decimal(18,2) ,括号中的2代表小数点后保留2位,但是在一些情况下我们需要保留小数点后面N位,这时我们可以这么做:

modelBuilder.Entity<User>().Property(p=>p.Money).HasPrecision(18,4);

三、字符串映射

当我们未对string类型的属性配置映射时,默认的数据库类型是 nvarchar(max),但是大部分情况下不会使用这个默认的映射。举几个例子来讲解一下怎么来改变这个默认映射。

1. 字段不可为空

//设置Name属性在数据库映射不可为空modelBuilder.Entity<User>().Property(p=>p.Name).IsRequired();

2. 字段可为空

//设置Birthday属性在数据库映射可为空modelBuilder.Entity<User>().Property(p=>p.Birthday).IsOptional();

四、日期映射

EF中的日期类型在数据库中默认映射为Date,但是数据库中的日期类型还有很多,并且有时候我们需要将日期类型映射为数据库其他类型,那么我们该怎么做呢?这里我们以映射为 DateTime 为例:

modelBuilder.Entity<User>().Property(p=>p.CreateDateTime).HasColumnType("DATETIME");

注:数值类型和日期类型属于值类型,因此我们不需要通过 IsRequired 来配置映射字段不可为空,因为默认就是不为空的。但是可以通过 IsOptional 设置可为空。

目录
相关文章
|
JSON Java Apache
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
在实际的开发过程中,常常遇到各个层之间对象转换,比如 VO、DTO、PO、DO 等,而如果都是手动set、get,一旦属性较多时,操作起来不仅麻烦,而且浪费时间,因此经常会使用一些工具类,进行对象之间的转换,下面将对象与对象之间转换的方式进行对比,一级对象间的使用进行总结。
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
|
6月前
mongoTemplate 嵌套对象包含id
mongoTemplate 嵌套对象包含id
62 0
|
搜索推荐 Java 程序员
对象映射你用哪个
对象映射你用哪个
92 0
|
SQL Java 数据库连接
2021-08-05mapper代理,几种pojo输入输出,pojo扩展通过扩展继承,映射主键普通属性映射,动态SQL,逆向工程
2021-08-05mapper代理,几种pojo输入输出,pojo扩展通过扩展继承,映射主键普通属性映射,动态SQL,逆向工程
63 0
|
6月前
|
XML Java 数据格式
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
69 0
|
6月前
|
Java 关系型数据库 MySQL
JPA中实体类属性相关注解与数据表列映射详解
JPA中实体类属性相关注解与数据表列映射详解
360 0
|
前端开发 Java Spring
DTO到entity自动赋值
DTO到entity自动赋值
194 1
DTO到entity自动赋值
|
数据库
一对多关系domain Model中设置使用AutoMapper时出错
一对多关系domain Model中设置使用AutoMapper时出错
171 0
一对多关系domain Model中设置使用AutoMapper时出错
java 将list里面根据实体类某个字段生成新的Map<字段,实体>
java 将list里面根据实体类某个字段生成新的Map<字段,实体>
353 0
|
API 数据库
Entity Framework复杂类型属性映射
Entity Framework复杂类型属性映射
147 0
Entity Framework复杂类型属性映射