我们在使用EF CodeFirst 模式生成数据库的时候进行表的代码映射关系可以采用注解模式和Fluent API模式。这里就是记录一下使用Fluent API进行表关系映射的方法。

注解模式:

回顾一下我们以前都知道的注解模式,一个表,在表的字段上和表上增加相应的注解进行映射即可:

    [Table("SysErrorLogInfor")]
public partial class SysErrorLogInfor
{
[Key]
public string id { get; set; } [Required] //必填
public int userId { get; set; } [MinLength()]//最小长度
public string userName { get; set; } [MaxLength]//最大长度
public string logLevel { get; set; } public string logMessage { get; set; } public DateTime? addTime { get; set; } public int? delFlag { get; set; }
}

Fluent API

那么我们如果同样使用Fluent API模式改如何实现哪,首先我写这个不是说Fluen API 比注解模式好,只是做个简单比较。不过使用Fluen API 模式可以使对象表更纯洁化。更加的整洁,但是同样的因为整洁了,少了很多东西,就需要在别的地方增加相应的东西。

你不写数据库是不知道你这个字段要干嘛是什么作用,有那些限制的。

还是刚才的那张表,现在改成这个样:

 public partial class SysErrorLogInfor
{
public string id { get; set; } public int userId { get; set; } public string userName { get; set; } public string logLevel { get; set; } public string logMessage { get; set; } public DateTime? addTime { get; set; } public int? delFlag { get; set; }
}

很清晰,这张表只为了表明当前表所存在那些字段和类型,但是具体的字段限制是不能辨别的。刚才也说了少一些东西必然增加一些东西,所有为了让映射知道我字段有那些限制我们还是要指定表的字段,那就要在创建一个规则类(这就是多出来的):

我们创建一个SysErrorLogInforMap类,这里此类需要基础 EntityTypeConfiguration<T>泛型所有需要添加引用:using System.Data.Entity.ModelConfiguration;

然后在该类的构造函数中设置SysErrorLogInfor表其中的属性字段代码如下:

public class SysErrorLogInforMap : EntityTypeConfiguration<SysErrorLogInfor>
{ public SysErrorLogInforMap()
{
//配置属性字段
Property(t => t.id).HasMaxLength();
Property(t => t.userName).HasMaxLength();
Property(t => t.logLevel).HasMaxLength();
//配置表名
ToTable("SysErrorLogInfor");
} }

这样你就对SysErrorLogInfor表设置了一个规则类,然后我们只需要启动这个规则就可以了,我们在上下文中的OnModelCreating方法中启动此规则,启动规则可以单个表的启用也可以全部启用(在表多的情况下):

注意:在OnModelCreating方法中配置Fluent API

Code First配置优先顺序为:Fluent API > DataAnnotations > default conventions

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//手动加载
//modelBuilder.Configurations.Add(new SysErrorLogInforMap());
//全部加载
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); }

配置方法

配置的规则非常多,我就不列举所有了你可以通过代码查看所有只说比较常用的几个

HasKey:配置主键

Property:配置那个属性,这个一般都是会在其后跟随配置的其他一个规则例如上面的之后跟随一个长度限制

HasMaxLength:最大长度

IsFixedLength:固定为多少位

IsOptional:将属性配置为可选属性。用于存储此属性的数据库列将可以为 null。

IsRequired:将属性配置为必需属性。用于存储此属性的数据库列将不可以为 null。

IsUnicode:将属性配置为支持 Unicode 字符串内容。

HasColumnName: 配置用于存储属性的数据库列的名称,这个我觉得就是一个是在代码中的属性名然后可以设置为数据库列名不同。

HasColumnType:配置用于存储属性的数据库列的数据类型,这个非常有用因为c#设置的string类型在映射到数据会自动成nvarchar(int)类型这个可以指定为varchar(int)类型,截图说明:

数据库策略问题

这里特别注意哦:配置表名那个地方如果你不写的话,加入你的EF模式配置的是关闭数据库生成策略的话你会发现意向不到的意外哦因为数据库的默认生成策略是复数形式所有当你启用关闭数据库生成策略的时候你会查不到表的错误。

当然你也不必像上面那样每个表都配置表名,可以在直接使用提供的方法关闭复数策略形式:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

关闭数据库生成策略代码示例:

public BaseDBContent()
: base("name=Entity")
{
Database.SetInitializer<BaseDBContent>(null);
}

其他策略:

数据库不存在时重新创建数据库

 Database.SetInitializer(new CreateDatabaseIfNotExists<BaseDBContent>());

每次启动应用程序时创建数据库(其实默认的不做任何配置就是会自动创建数据库的)

Database.SetInitializer(new DropCreateDatabaseAlways<BaseDBContent>());

模型更改时重新创建数据库

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BaseDBContent>());

禁用关系数据的级联删除

 // 禁用一对多级联删除
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
// 禁用多对多级联删除
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

禁用延迟加载(Lazy Loading)

// 禁用延迟加载
this.Configuration.LazyLoadingEnabled = false;

Code First默认规则

表及列默认规则:EF Code First默认生成的表名为类名的复数形式

主键约束:实体类中属性名为Id或[类名]Id,将作为生成表的主键。若主键为int类型,则默认为Sql Server的Identity类型

字符类型属性:实体类中string类型的属性,在生成表时,对应Sql Server中nvarchar(max)类型

Byte Array类型约束:实体类中byte[]类型的属性,生成表时对应Sql Server中varbinary(max)类型

Boolean类型约束:实体类中bool类型的属性,在生成表是对应Sql Server中bit类型

【EF】CodeFirst Fluent API使用记录的更多相关文章

  1. 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解

    1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...

  2. CodeFirst Fluent API

    本文转自:疯狂的我  CodeFirst Fluent API EF的好处之一就是实现了概念模型和存储模型的分离,我们可以为概念实体和存储实体起不同的名称,同时还可以将一个概念实体映射到多个存储实体, ...

  3. 第六节:框架搭建之EF的Fluent Api模式的使用流程

    一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...

  4. EF:Fluent API 把一对多映射为一对一

    假设有两张表:A表和B表.A表与B表在数据库中的关系是一对多,但我们需要在EF中映射为一对一. 首先在A实体类和B实体类中互相为对方增加一个实体类的属性: public A { public B B ...

  5. DB表的关系及EF中Fluent API的使用

    现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...

  6. EF Core Fluent API

    多对多配置 先安装 Install-Package MySql.Data.EntityFrameworkCore 创建3个表 创建类 public class Role { public long I ...

  7. EF使用Fluent API配置映射关系

    定义一个继承自EntityTypeConfiguration<>泛型类的类来定义domain中每个类的数据库配置,在这个自定义类的构造函数中使用我们上次提到的那些方法配置数据库的映射. 映 ...

  8. 扩展EF的Fluent API中的 OnModelCreating方法 实现全局数据过滤器

    1.生成过滤的表达式目录树 protected virtual Expression<Func<TEntity, bool>> CreateFilterExpression&l ...

  9. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

随机推荐

  1. 反沙箱——SetErrorMode

    目录 1.前言 2.原理讲解 3.代码实现 4.参考 1.前言 利用SetErrorMode进行反沙箱的技术,在2010年就有被提出,但是之前搜了很久都没有相关内容,这里简单的说一下这个反沙箱的实现. ...

  2. 封装一个 员工类 使用preparedStatement 查询数据 (1)

    创建员工类  自动生成get set 方法 package cn.hph; public class emp { //定义表中的属性 private int id; private String en ...

  3. js-day02-BOM和DOM

    BOM和Document对象常见属性和方法: BOM是browser object model的缩写,简称浏览器对象模型. Document 对象每个载入浏览器的 HTML 文档都会成为 Docume ...

  4. DDD事件总线的实现

    基本思路: (1)       在事件总线内部维护着一个事件与事件处理程序相映射的字典. (2)       利用反射,事件总线会将实现了IEventHandler的处理程序与相应事件关联到一起,相当 ...

  5. 从SQL注入到内网漫游

    前言 在一次渗透实战中,发现了一个注入点,最后成功的漫游了内网. 正文 在渗透中遇到一个站点,顺手测试了一下,在搜索框随便输入了一个字符加个单引号直接报错了,差不多可以确认这里存在注入了.一般这种站安 ...

  6. Java Web每天学之Servlet的原理解析

    Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...

  7. [Swift]LeetCode85. 最大矩形 | Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and ...

  8. shell 删除重复文件脚本

    摘自 <Linux Shell脚本攻略>一书,例子在109页,原理在110页,原理讲解的很好哦! 需要了解awk命令.xargs,脚本中所用的命令在Linux Shell脚本攻略一书中都有 ...

  9. CentOS7 Linux中通过加密grub防止黑客通过单用户系统破解root密码

    如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据? 给grub加密,不让别人通过grub进入单用户. 17.3.1  基于centos6进行grub加密 [root@63 ~]# gr ...

  10. 第2章 Java编程基础

    本章重点 ·Java的基本语法形式 ·Java语言中的常量与变量 ·Java语言运算符的使用 ·Java程序的流程控制 ·Java中方法的定义与使用 ·Java中数组的定义与使用 2.1 Java的基 ...