【EF】CodeFirst Fluent API使用记录
我们在使用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使用记录的更多相关文章
- 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解
1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...
- CodeFirst Fluent API
本文转自:疯狂的我 CodeFirst Fluent API EF的好处之一就是实现了概念模型和存储模型的分离,我们可以为概念实体和存储实体起不同的名称,同时还可以将一个概念实体映射到多个存储实体, ...
- 第六节:框架搭建之EF的Fluent Api模式的使用流程
一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...
- EF:Fluent API 把一对多映射为一对一
假设有两张表:A表和B表.A表与B表在数据库中的关系是一对多,但我们需要在EF中映射为一对一. 首先在A实体类和B实体类中互相为对方增加一个实体类的属性: public A { public B B ...
- DB表的关系及EF中Fluent API的使用
现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...
- EF Core Fluent API
多对多配置 先安装 Install-Package MySql.Data.EntityFrameworkCore 创建3个表 创建类 public class Role { public long I ...
- EF使用Fluent API配置映射关系
定义一个继承自EntityTypeConfiguration<>泛型类的类来定义domain中每个类的数据库配置,在这个自定义类的构造函数中使用我们上次提到的那些方法配置数据库的映射. 映 ...
- 扩展EF的Fluent API中的 OnModelCreating方法 实现全局数据过滤器
1.生成过滤的表达式目录树 protected virtual Expression<Func<TEntity, bool>> CreateFilterExpression&l ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
随机推荐
- 动态规划-LIS1
https://vjudge.net/contest/297216?tdsourcetag=s_pctim_aiomsg#problem/J #include<bits/stdc++.h> ...
- js 原型链的介绍
对象的原型链:一个对象所拥有的属性不仅仅是它本身拥有的属性,他还会从其他对象中继承一些属性.当js在一个对象中找不到需要的属性时,它会到这个对象的父对象上去找,以此类催,这就构成了对象的原型链. 下面 ...
- Linux shell编程 -test
test 命令的格式非常简单 test condition condition 是test命令要测试的一系列参数和值.当用在if-then 语句中时,test 命令看起来是这样的 if test co ...
- autpmapper映射忽略某个属性
1.直接加特性[IgnoreMap] 2.映射规则 CreateMap<BaseAccount, BaseAccountListDto>().ForMember(dest => de ...
- gc笔记2
空间分配担保:在发生MinorGC之前,虚拟机会检查老年代最大连续可用是否大于新生代所有对象的空间,如果这个条件成立,则minorgc时安全的
- Puppeteer 应用容器化
Puppeteer 应用容器化 Intro Puppeteer是谷歌官方出品的一个通过DevTools协议控制headless Chrome的Node库.可以通过Puppeteer的提供的api直接控 ...
- 【RL-TCPnet网络教程】第18章 BSD Sockets基础知识
第18章 BSD Sockets基础知识 本章节为大家讲解BSD Sockets,需要大家对BSD Sockets有个基础的认识,方便后面章节Socket实战操作. (本章的知识点主要整理自 ...
- Python 安装和 Pycharm 环境配置
一.Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它 ...
- 分门别类总结Java中的各种锁,让你彻底记住
概念 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者饥 ...
- [Swift]LeetCode153. 寻找旋转排序数组中的最小值 | Find Minimum in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...