ORM系列之二:EF(4) 约定、注释、Fluent API

目录

1.前言

2.约定

2.1 主键约定

2.2 关系约定

2.3 复杂类型约定

3.数据注释

3.1 主键

3.2 必需

3.3 MaxLength和MinLength

3.4 NotMapped

3.5 复杂属性

3.6 ConcurrencyCheck

4.Fluent API

5.总结

前言  

  在之前的Code First示例中,我们编写好代码直接运行,就自动会自定创建数据库,并且根据定义好的类创建了对应的表,更加神奇的时候竟然还能自动创建主键、外键等等。这是如何实现的呢?如果我们想指定特定的属性为主键又该如何实现呢? 

约定  

  其实Code First生成模型的时候会通过约定(Conventions)来检测,约定实际上是EF定义的一组规则集,用于在使用Code First时根据这些规则生成模型,是在System.Data.Entity.ModelConfiguration.Convertions命名空间中定义的,我们可以去扩展约定,当然也可以不是使用内置的约定。EF内置约定如下:

  

  从上图我们可以看到定义了复杂属性预定、外键预定、主键约定,当然还有很多很多,EF也一直扩充内置约定。

  

  主键约定  

  如果类的属性名为“ID”(不区分大小写)或者类名的后面跟有“ID”,则Code First会推断该属性是主键。如果主键属性的类型为数值或者GUID,则将其配置为标识列。

  

  如上图所示,DepartmentID会被约定为主键。

  关系约定  

  如果类A中的属性中包含他类B的属性(该属性在类B本身中约定为主键),并且类A中包含类B,则Code First会自动推断出关联关系,并确定外键。

  

  如上图所示,在DepartmentID在Course表中会定义为外键,并且Department表和Course表会自动建立关联关系。

  

  复杂类型约定

  当Code First无法推断出主键,并没有通过其他方式设置主键,则该类型会被自动当做复杂属性。对于以下类定义,Code First推断Details是复杂属性,因为它没有主键。

  

  更多参考:https://msdn.microsoft.com/zh-cn/library/jj679962(v=vs.113).aspx

数据注释  

  默认情况下,Code First会根据约定定义模型,但是默认的约定规则毕竟有限,Code First同样允许通过数据注释来定义模型,而且如果没有移除约定的话,会先通过约定定义,再通过数据注释来定义,那么数据注释是如何实现的呢?

  主键  

  类中需要通过数据注释来定义主键,非常简单,只需要在对应的属性上面加上KEY关键字,如下所示:

  

  必需  

  属性上面加上Requied关键字,说明这个属性是必需的,即不允许为空。

  

  MaxLength和MinLength  

  使用MaxLength和MinLength特性,可以限定字段的范围。

  

  上图定义BloggerName长度为5-10。

  NotMapped  

  不映射,顾名思义就是不会将类的属性映射到数据库表的字段上,标记了NotMapped特性不会在数据库表中生成对应的字段。

  

  复杂属性  

  在类名上面增加ComplexType特性,并且其他类中某属性为该类时,该类映射到数据时就会变成复杂属性。

  

  

  Blog类中添加一个属性为BlogDetails。

public BlogDetails BlogDetail { get; set; }

    

  ConcurrencyCheck  

  ConcurrencyCheck注释可用于标记要在用户编辑或删除实体时用于在数据库中进行并发检查的一个或多个属性。

    

  调用 SaveChanges 时,因为 BloggerName 字段上具有 ConcurrencyCheck 注释,所以在更新中将使用该属性的初始值。该命令将尝试通过同时依据键值和 BloggerName 的初始值进行筛选来查找正确的行。下面是发送到数据库的 UPDATE 命令的关键部分,在其中您可以看到该命令将更新 PrimaryTrackingKey 为 1 且 BloggerName 为“Julie”(这是从数据库中检索到该博客时的初始值)的行。

  

  如果在此期间有人更改了该博客的博主姓名,则此更新将失败,并引发 DbUpdateConcurrencyException 并且需要处理该异常。

  

  更多参考:https://msdn.microsoft.com/zh-cn/library/jj591583(v=vs.113).aspx

Fluent API  

  Code First模式下,默认行为是使用一组EF内嵌的约定规则将类映射到表。但有时候约定无法满足需求,这是我们还可以通过数据注释的方式来实现,但是数据注释功能仍然有限,好在EF提供了更加灵活的方式——Fluent API。

  Fluent API功能非常强大,它在通过重写DbContext上的OnModelCreating方法来实现自定义规则,可以设置主键、组合主键、外键、指定长度、指定属性是否映射到表等等。

  

  

  更多参考:https://msdn.microsoft.com/zh-cn/library/jj591617(v=vs.113).aspx

总结

  既然EF内置了很多约定规则,为何又可以通过数据注释方式来定义模型,而且还可以通过功能更加强大的Fluent API自定义模型。

  虽然内置的约定规则非常多,而且我想微软以后还会不断加入更多的约定,但是这些约定毕竟还是有限的,不能够满足所有用户需求,所以允许通过数据注释的方式来增加定义模型,但是有些情况通过数据注释依然是无法满足(例如:一个类型生成一张表还是多张表),这是我们可以通过Fluent API在生成模型之前自定义模型。

  综上所述,我们得知这三种定义模型的优先级为:约定—>数据注释—>Fluent API。

  

时间: 2024-10-15 21:55:13

ORM系列之二:EF(4) 约定、注释、Fluent API的相关文章

WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现

原文:WPF技术触屏上的应用系列(二): 嵌入百度地图.API调用及结合本地数据库在地图上进行自定义标点的实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子上架了,经过

1.Relationship in Entity Framework Using Code First Approach With Fluent API【使用EF Code-First方式和Fluent API来探讨EF中的关系】

In this article, you will learn about relationships in Entity Framework using the Code First Approach with Fluent API. 在这篇文章中,你将会学习到使用EF Code-First方式和Fluent API来探讨EF中的关系(一对一,一对多,多对多). Introduction[介绍] A relationship, in the context of databases, is a

ORM系列之二:Entity Framework(2)Code First

目录 1. Code First是什么? 2. Code First 简单示例 3. 数据存储 4. 迁移 Code First是什么 Code First 顾名思义就是先写代码,当然不是乱写,而是安装一定的约定,先创建实体类,再通过编辑器自动生成数据模型.Code First是EF的三大模式之一,主要使用新的系统开发,对应数据库已存在的情况下不适合. Code First 简单示例 下面通过一个简单的示例,让我们来熟悉一下Code First模式. 第一步:创建一个控制台程序,命名为“EF.C

【EF】EF框架 Code First Fluent API

在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreating方法,在此方法体内调用Fluent API. 如下面代码所示: public class BlogDbContext : DbContext { public BlogDbContext() : base("name=BlogDB2005") { } protected override

EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)

上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点击浏览搜索EF安装,我这里主要是EF6.0 以上的学习 所以都安装6.0 以上的版本 接下来在Model文件夹下面创建一个Customer类 public class Customer { public int ID { get; set; } public string Name { get; set; }

CRL快速开发框架系列教程二(基于Lambda表达式查询)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

一步一步学EF系列【2、Fluent API的方式来处理实体与数据表之间的映射关系。】

EF里面的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面,还有一个就是Fluent API,通过新增相应的配置类来覆盖默认配置另外.我们主要学习Fluent API,Data Annotations可以自行去学习一下. 补充一下为什么要用Fluent API 使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入Ent

JuheNews系列之二 &#183; ToolBar+AppBarLayout+CoordinatorLayout+CollapsingToolbarLayout+NestedScrollView

JuheNews系列之二 · ToolBar+AppBarLayout+CoordinatorLayout+CollapsingToolbarLayout Android5.0重要的改变之一,除了Material Design风格的设计思想,应该就是沉浸式状态栏了吧.之前实现沉浸式的效果时,都是借助SystemBarTint来实现,或许以后你也可以丢弃这种方式了. 除此之外,由于actionbar不够灵活,项目中我一般喜欢把Activity的ActionBar去掉,然后自己在布局中写一个公用的H

MVC3+EF4.1学习系列(十)----MVC+EF处理树形结构

通过前几篇文章 我们处理了 一对一, 一对多,多对多关系 很好的发挥了ORM框架的做用 但是 少说了一种 树形结构的处理, 而这种树形关系 我们也经常遇到,常见的N级类别的处理, 以及经常有数据与类别挂钩.今天主要写下EF处理树形结构以及 MVC如何展示树形结构. 前面几篇的例子 一直用的是一个例子,内容是连贯的.这篇是完全单独的~ 先来说下工作中会遇到的常见场景 针对这几个场景来处理~ 1.类别 a.类别可以有无限级别 b.类别的最末端 不确定是第几级 某个节点 可以到二级 其他的节点 有可能