一. 简介

1. 优先级:Fluent API > data annotations > default conventions.

2. 所有的Fluent API配置都要在 OnModelCreating这个重写方法中进行

3. 常见的配置:

   ① 获取表对应的配置根: var stu =modelBuilder.Entity<XXX>();

   ② 设置主键:HasKey<string>(s => s.studentKey);

   ③ 获取属性:stu.Property(p => p.stuName)

   ④ 设置可空或非空:IsRequired和IsOptional

  ⑤ 设置最大值:HasMaxLength

   ⑥ 修改属性名→修改属性的次序→修改属性对应的数据库类型:HasColumnName→HasColumnOrder→HasColumnType

   ⑦ 修改表名:ToTable

4. 可以建立多个Fluent API的配置文件,然后通过 modelBuilder.Configurations.Add(new XXX());添加到一起

PS:或者利用这句话   modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());     把所有的配置文件一次性全部加进来

二. 代码实战

   public class Student5
{
//主键声明
public string studentKey { get; set; } //非空声明
public string stuName { get; set; } //最大长度
public string stuTxt1 { get; set; } //最大长度和最小长度
public string stuTxt2 { get; set; } //设置为时间戳
public byte[] rowVersion { get; set; } //并发检查
public string stuTxt3 { get; set; } //public virtual StudentAddress5 stuAddress5 { get; set; }
}
public class StudentAddress5
{
//既是主键、又是外键
public string stuAddressId { get; set; } //设置映射数据库中表的列名
public string stuAddressName { get; set; } //设置映射数据库中表的列名、顺序、类型
public string stuAddrssName2 { get; set; } //不映射数据
public string addressNum { get; set; } //不映射数据
public string txt1 { get { return stuAddrssName2; } } //不映射数据
public string _txt2 = "";
public string txt2 { set { _txt2 = value; } } //public virtual Student5 stu { get; set; }
} /// <summary>
/// Game实体,与其它两个没有什么直接关系,单纯的为了演示, Fluent API的配置,可以根据实体进行拆分
/// 文件来配置,方便管理
/// </summary>
public class Game
{
public int GameId { get; set; } public string GameName { get; set; }
}
      /// <summary>
/// Game实体的配置文件
/// </summary>
public class GameConfiguration : EntityTypeConfiguration<Game>
{
public GameConfiguration()
{
this.HasKey(p => p.GameId); this.Property(p => p.GameName).HasMaxLength().IsRequired();
}
}
 public class dbContext5 : DbContext
{
public dbContext5()
: base("name=dbContext5")
{ } public DbSet<Student5> Student5 { get; set; } public DbSet<StudentAddress5> StudentAddress5 { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//所有的FluentAPI均在方法中进行重写 //一. 属性层次上的设置
var stu = modelBuilder.Entity<Student5>();
var stuAddress = modelBuilder.Entity<StudentAddress5>(); //1. 设置主键
stu.HasKey<string>(s => s.studentKey);
stuAddress.HasKey<string>(s => s.stuAddressId); //为什么需要动态设置主键,有待研究?? //2. 设置非空 (扩展:IsOptional 设置可空)
stu.Property(p => p.stuName).IsRequired(); //3. 设置最大值(不能设置最小值)
stu.Property(p => p.stuTxt1).HasMaxLength(); //4. 修改列的名称、排序、类型
stuAddress.Property(p => p.stuAddrssName2).HasColumnName("myAddress2").HasColumnOrder().HasColumnType("varchar"); //5.修改表名
stu.Map<Student5>(c =>
{
c.ToTable("MyStudent"); }); //6.将一个实体映射成多张表,并分别给其命名
//stuAddress.Map<StudentAddress5>(c =>
//{
// c.Properties(p => new
// {
// p.stuAddressId,
// p.stuAddressName
// });
// c.ToTable("MyStuAddress1");
//}).Map<StudentAddress5>(c =>
//{
// c.Properties(p => new
// {
// p.stuAddressId,
// p.stuAddrssName2
// });
// c.ToTable("MyStuAddress2");
//}); //三. 将Game实体的配置添加进来
modelBuilder.Configurations.Add(new GameConfiguration()); base.OnModelCreating(modelBuilder);
}
}
    <!--正宗的CodeFirst Fluent API-->
<add name="dbContext5" connectionString="data source=localhost;initial catalog=CodeFirstDB5;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

三. 总结

  无论是DataAnnotation还是Fluent API,都会发现一个现象,当数据库结构发生变化的时候,就会抛出异常,不得不把数据库删除,重新生成,这样就会导致原数据库中的数据丢失,在实际开发中,显然是不可取的。那么为什么会抛异常呢?怎么解决这个数据丢失的问题呢?详见下一个章节:数据库初始化策略和数据迁移。

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第十六节: EF的CodeFirst模式通过Fluent API修改默认协定的更多相关文章

  1. 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定

    一. 简介 1. DataAnnotations说明:EF提供以特性的方式添加到 domain classes上,其中包括两类:  A:System.ComponentModel.DataAnnota ...

  2. 第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移

    一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略: 1. CreateDatabaseIfNotExists:EF的默认策略,数据库不存在,生成数据库:一旦model发生变 ...

  3. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  4. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  5. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  6. 第十六节、基于ORB的特征检测和特征匹配

    之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...

  7. centos linux系统日常管理3 服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,curl,ping ,telnet,traceroute ,dig ,nc,nmap,host,nethogs 第十六节课

    centos linux系统日常管理3  服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,cur ...

  8. 第四百一十六节,Tensorflow简介与安装

    第四百一十六节,Tensorflow简介与安装 TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统,克服了第一代系统DistBelief仅能开发神经网络算法.难 ...

  9. EF的CodeFirst模式自动迁移(适用于开发环境)

    EF的CodeFirst模式自动迁移(适用于开发环境) 1.开启EF数据迁移功能 NuGet包管理器------>程序包管理控制台---------->Enable-Migrations ...

随机推荐

  1. Windows Server 2012 R2 配置FTP服务器

    Windows Server 2012 R2 安装IIS参考上一篇配置IIS 8.0:https://www.cnblogs.com/aq-ry/p/9329310.html 搭建完IIS 后,最近又 ...

  2. SQLServer之索引简介

    索引设计基础知识 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度. 索引包含由表或视图中的一列或多列生成的键. 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速 ...

  3. MySql 学习之路-基础

    Mysql 自学之路 本文包含基础部分与高级部分 一.基础 数据库操作 Show databases:显示所有的数据库 Show tables: 显示所有的数据库表 Use databasename: ...

  4. 新数据革命: 开源C#图形化爬虫引擎Hawk5发布

    https://ferventdesert.github.io/Hawk/ Hawk是一款由沙漠之鹰历时五年个人业余时间开发的,开源图形化爬虫和数据清洗工具,GitHub Star超过2k+,前几代版 ...

  5. Python开发【第三篇】基本数据类型

    整型 int __author__ = 'Tang' # 将字符串转换为数字 a = " b = int(a) # 前面是0的数转换,默认base按照十进制 a = " b = i ...

  6. 5000量子位支持量子编程,D-Wave推出下一代量子计算平台计划

    5000量子位支持量子编程,D-Wave推出下一代量子计算平台计划 近日,全球量子商用化重要参与者 D-Wave 公司又有大动作:推出其5000量子比特量子计算的发展蓝图.D-Wave 下一代量子计算 ...

  7. 在windows下远程访问linux桌面

    一.安装xrdp工具: #  yum install xrdp #   yum install tigervnc-server #   service xrdp start 以上三个命令执行完毕安装完 ...

  8. (二)Basic Concepts 基本概念

    Basic Concepts There are a few concepts that are core to Elasticsearch. Understanding these concepts ...

  9. MongoDB install

    下载地址1:https://www.mongodb.org/dl/linux下载地址2:https://www.mongodb.com/download-center/community关于Mongo ...

  10. LOJ2396 JOISC2017 长途巴士 斜率优化

    传送门 将乘客按照\(D_i\)从小到大排序并重新标号.对于服务站\(j\),如果\(S_j \mod T \in (D_i , D_{i+1})\),那么可以少接一些水,在保证司机有水喝的情况下让编 ...