我们在使用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. 树莓派3B+上运行.Net Core项目

    最近买了个树莓派3B+,准备把自己写的一个.Net Core爬虫挂在上面跑 买之前没有想到树莓派因为是今年新出的,导致驱动以及系统啥的都不是很完善,导致走了很多弯路,早知道买树莓派3就不用那么多折腾了 ...

  2. MVVM简介与运用

    在介绍MVVM框架之前,先给大家简单介绍一下MVC.MVP框架(由于本博文主要讲解MVVM,所以MVC和MVP将简化介绍,如果需要我将在以后的博文中补充进来). MVC框架: M-Model : 业务 ...

  3. koa2学习(二) 中间件router

    中间件 koa-router 安装 npm install --save koa-router 使用 const Koa = require('koa'); const Router = requir ...

  4. [Swift]LeetCode893. 特殊等价字符串组 | Groups of Special-Equivalent Strings

    You are given an array A of strings. Two strings S and T are special-equivalent if after any number ...

  5. linux入门--Linux和UNIX的关系及区别

    UNIX 与 Linux 之间的关系是一个很有意思的话题.在目前主流的服务器端操作系统中,UNIX 诞生于 20 世纪 60 年代末,Windows 诞生于 20 世纪 80 年代中期,Linux 诞 ...

  6. ubuntu18下安装docker

    1.通过指令检查linux内核 uname -a  可以看到大于3.10版本 2.检查是否存在对应目录 ls -l /sys/class/misc/device-mapper 3. apt-get指令 ...

  7. React 中的this.setState

    在react中如何修改state中的数据     第一种写法:this.setState()         参数1:对象 需要修改的数据         参数2:回调 this.setState是一 ...

  8. nginx 关于client_max_body_size client_body_buffer_size配置

    最近生产环境在这两个参数之间遇到过几次坑.这里记录下.client_max_body_sizeclient_max_body_size 默认 1M,表示 客户端请求服务器最大允许大小,在“Conten ...

  9. scala用ssh2连接Linux

    这个需要安装库: import ch.ethz.ssh2.{Connection, Session, StreamGobbler} 首先用 ip 和 post 创建连接: val conn: Conn ...

  10. 10.Django ModelForm

    ModelForm 1.ModeForm简单验证 from django.db import models # Create your models here. class UserInfo(mode ...