Entity Framework 查漏补缺 (三)
Code First的数据库映射
有两种方式来实现数据库映射:
- 数据属性:Data Annotation
- 映射配置: Fluent API
有继承关系的实体如何映射?
- Code First在生成数据库表时,默认使用TPH方式
就是把父类和子类生成同一张表,额外增加了一列Discriminator字段,区分是父类或子类的数据类型
比如:
父类Book对象
public class Book
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int BookID { get; set; }
public string BookName { get; set; }
public int Pages { get; set; }
}
子类HistoryBooks对象,继承Book
public class HistoryBooks:Book
{
public int Chapter { get; set; }
}
数据库生成一张表

- 另一种方式(Data Annotation实现):TPT
不管父类子类,各自生成一张表,以及在子类中增加两者联系的外键;
定义TPT方式 父类和子类定义 [Table("XXX")]
如:
父类
[Table("Book")]
public class Book
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int BookID { get; set; }
public string BookName { get; set; }
public int Pages { get; set; }
}
子类
[Table("HistoryBooks")]
public class HistoryBooks:Book
{public int Chapter { get; set; }
}
映射数据生成的两张表
Book:

HistoryBooks:

映射方式一:Data Annotation
给实体对象的属性加上注解特性,实现与数据库之间建立映射关系并进行控制
如:

Booid映射到表中字段为自增的主键
DataAnnotations 包含的常用特性:
KeyAttribute:对应数据库中表的主键的设置
RequiredAttribute:对应数据库中字段的数据不可null
MaxLengthAttribute:对应数据库中字符串类型字段的最大长度
ConcurrencyCheckAttribute:指定用于开放式并发检查的列的数据类型
TimestampAttribute:将列的数据类型指定为行版本
DatabaseGeneratedAttribute:标记指定实体属性是由数据库生成的,并指定生成策略(None数据库不生成值,Identity当插入行时,数据库生成值,Computed当插入或更新行时,数据库生成值)
TableAttribute:指定实体类对应的数据表名
ColumnAttribute:指定实体属性在数据库中的列名
ForeignKeyAttribute :指定导航属性的外键字段
NotMappeAttribute:不映射对应字段
映射方式二:Fluent API
Fluent API的配置方式可以将实体类与映射配置进行解耦合
有两种方式来实现Fluent API的映射配置
- 第一种:重写Dbcontext的中OnModelCreating方法
如下面的Book类,不再有Data Annotation特性
public class Book
{
public int BookID { get; set; }
public string BookName { get; set; }
public int Pages { get; set; }
}
重写Dbcontext中的OnModelCreating方法实现Book类映射的配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Book>().HasKey(t => t.BookID); base.OnModelCreating(modelBuilder);
}
现实项目中,实体对象可能是非常多的,在OnModelCreating方法中逐一进行映射配置,可想而知会造成Dbcontext的代码庞大。
- 第二种:新建BookMap类,并继承EntityTypeConfiguration<EntityType>
1、在新建的BookMap类实现映射配置
public class BookMap : EntityTypeConfiguration<Book>
{
public BookMap()
{
this.ToTable("Book", "dbo");
this.HasKey(p => p.BookID);
//this.HasKey(p => new { p.BookID, p.BookPreID });//关联主键
this.Property(p => p.BookID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);//自动生成
this.Property(p => p.BookName).IsRequired().HasMaxLength().HasColumnName("BookName").IsUnicode(false);//非空,最大长度20,自定义列名,列类型为varchar而非nvarchar
this.Ignore(p => p.BookDescription);//忽略改属性的映射
}
}
2、依旧重写Dbcontext中的OnModelCreating方法,将BookMap 类的实例添加到modelBuilder的Configurations。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new BookMap());
}
这样能大大减少OnModelCreating的代码量,依然存在一个问题,就是实体对象一多,还是要逐条将Map类的实例添加到modelBuilder的Configurations
3、利用反射将程序集中所有的EntityTypeConfiguration添加到modelBuilder.Configurations中,可以说完全解耦了
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
.Where(type => !String.IsNullOrEmpty(type.Namespace))
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.Configurations.Add(configurationInstance);
}
}
注:此段代码源自网友文章,摘自nopCommerce项目的代码 连接
Entity Framework 查漏补缺 (三)的更多相关文章
- Entity Framework 查漏补缺 (一)
明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...
- Entity Framework 查漏补缺 (二)
数据加载 如下这样的一个lamda查询语句,不会立马去查询数据库,只有当需要用时去调用(如取某行,取某个字段.聚合),才会去操作数据库,EF中本身的查询方法返回的都是IQueryable接口. 链接: ...
- 【Android面试查漏补缺】之事件分发机制详解
前言 查漏补缺,查漏补缺,你不知道哪里漏了,怎么补缺呢?本文属于[Android面试查漏补缺]系列文章第一篇,持续更新中,感兴趣的朋友可以[关注+收藏]哦~ 本系列文章是对自己的前段时间面试经历的总结 ...
- js基础查漏补缺(更新)
js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...
- 20165223 week1测试查漏补缺
week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...
- Mysql查漏补缺笔记
目录 查漏补缺笔记2019/05/19 文件格式后缀 丢失修改,脏读,不可重复读 超键,候选键,主键 构S(Stmcture)/完整性I(Integrity)/数据操纵M(Malippulation) ...
- Django 查漏补缺
Django 查漏补缺 Django 内容回顾: 一. Http 请求本质: 网络传输,运用socket Django程序: socket 服务端 a. 服务端监听IP和端口 b. 浏览器发送请求 ...
- Mysql查漏补缺
Mysql查漏补缺 存储引擎 数据库使用存储引擎来进行CRUD的操作,不同的存储引擎提供了不同的功能.Mysql支持的存储引擎有InnoDB.MyISAM.Memory.Merge.Archive.F ...
- Java查漏补缺(3)(面向对象相关)
Java查漏补缺(3) 继承·抽象类·接口·静态·权限 相关 this与super关键字 this的作用: 调用成员变量(可以用来区分局部变量和成员变量) 调用本类其他成员方法 调用构造方法(需要在方 ...
随机推荐
- bzoj [Noi2002]Savage 扩展欧几里得
枚举m,n^2判断 对于野人i,j,(H[i]+x*S[i])%m==(H[j]+x*S[j])%m,且x<=O[i]&&x<=O[j],他们才有可能相遇 化简得:(S[i ...
- Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载)
Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构,我采用以下三种维度来讲解 1. 代码层面. 2. 数 ...
- Dubbo原理和源码解析之标签解析
一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...
- 旅行app(游记、攻略、私人定制) | 顺便游旅行H5移动端实例
<顺便游旅行>是一款H5移动端旅行app,提供目的地(国内.国外.周边)搜索.旅游攻略查询.游记分享.私人定制4大模块,类似携程.同程.去哪儿.马蜂窝移动端,只不过顺便游app界面更为简洁 ...
- SQL Server事务 事务日志
事务 (SQL Server) 一.事务概念 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统 ...
- 理解图像分割中的卷积(Understand Convolution for Semantic Segmentation)
以最佳的101 layer的ResNet-DUC为基础,添加HDC,实验探究了几种变体: 无扩张卷积(no dilation):对于所有包含扩张卷积,设置r=1r=1 扩张卷积(dilation Co ...
- Spring Framework学习要点摘抄
以下摘自Spring Framework官方文档,版本Spring 4.3. <context:annotation-config/> implicitly registered post ...
- 基于SpringBoot从零构建博客网站 - 确定需求和表结构
要确定一个系统的需求,首先需要明确该系统的用户有哪些,然后针对每一类用户,确定其需求.对于博客网站来说,用户有3大类,分别是: 作者,也即是注册用户 游客,也即非注册用户 管理员,网站维护人员 那么从 ...
- Layer 使用
官网文档 http://layer.layui.com/mobile/api.html 1.需要添加jquery的引用然后是 loadExtentFile("css", " ...
- 干货!分享一款windows下的磁盘分析神器。
作为开发人员的你,肯定遇到过这样的情况,120G SSD系统盘居然满载了,到底是被哪些程序占用了,包含哪些大文件,这个时候脑袋里就开始回忆了.....这对平时没有养成规范化记录安装软件好习惯的同学而言 ...