我们在使用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. Java for Andriod 第二周学习总结

    第四章 学习时遇到的问题或新知识点: 1. 构造方法.每个类至少有一个构造方法,且构造方法必须的名称必须与类名相同. 2. Varargs.允许方法拥有一个可变长度的参数列表. 3. 对象的内存分配. ...

  2. IIS中 flv、swf 文件无法播放

    解决方案: 1.服务器安装flash,这是必须的. 2.MIME类型添加两个:名称.swf,值application/x-shockwave-flash:名称.flv,值flv-application ...

  3. DOS命令(一)

    1. echo 输出内容,用来输出文字. [例如:echo hello] 2. titile 标题,用来修改标题. 3. color 背景色前景色,用来设置背景色和前景色 0 = 黑色 8 = 灰色 ...

  4. fremarker导出word list

    import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java ...

  5. TechEmpower最新一轮的性能测试出炉,ASP.NET Core依旧表现不俗

    TechEmpower在10月30发布最新一轮(Round 17)针对“Web Framework Benchmarks”的性能测试报告,ASP.NET Core依旧表现不俗,在一些指标上甚至是碾压其 ...

  6. [Swift]LeetCode295. 数据流的中位数 | Find Median from Data Stream

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  7. [Swift]LeetCode402. 移掉K位数字 | Remove K Digits

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  8. [Swift]LeetCode456. 132模式 | 132 Pattern

    Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that  ...

  9. [Swift]LeetCode899. 有序队列 | Orderly Queue

    A string S of lowercase letters is given.  Then, we may make any number of moves. In each move, we c ...

  10. markdown反射型xss漏洞复现

    markdown xss漏洞复现 转载至橘子师傅:https://blog.orange.tw/2019/03/a-wormable-xss-on-hackmd.html 漏洞成因 最初是看到Hack ...