一. 前言

  沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程。
1. Fluent API属于EF CodeFirst模式的一种,EF还有一种模式是DataAnnotations,两种模式各有千秋吧,前面的EF系列已经详细介绍过他们的使用了,本节主要介绍 Fluent API模式在实际框架中的使用流程.
本节需要用到的技术有:

  ①:EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定
  ②:EF的CodeFirst模式通过DataAnnotations修改默认协定
  ③:EF的CodeFirst模式通过Fluent API修改默认协定
  ④:EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移

2. 框架模式
  这里不采用传统的三层架构(DAL、BLL),而是使用:Ypf.DTO、Ypf.Service、Ypf.IService、Ypf.Utils、Ypf.Web 这种划分模式,本节为了方便测试,仅仅使用 Ypf.Service 和 Ypf.Test(控制台)两个框架进行测试。

3. 业务模拟
  ①. 用户基本信息和角色基本信息,不做关联
  ②. 用户信息增加了或者删除
  ③. 角色信息删除了或者增加

二. 使用步骤

1.  新建【Ypf.Service】类库和【Ypf.Test】控制台项目,并分别通过Nuget安装EF程序集。

2. 在【Ypf.Service】类库中新建“UserInfor”、“RoleInfor”实体类,“UserInforConfig”、“RoleInforConfig”实体类对应的隔离出来的表的配置文件。

PS:这里为了方便管理,一张表对应一个EF的配置类文件,比全部直接写在 OnModelCreating 方法中更清晰。

分享实体类代码:

     /// <summary>
/// 用户表
/// </summary>
public class UserInfor
{
public string id { get; set; }
public string userName { get; set; }
public int userAge { get; set; }
}
/// <summary>
/// 角色信息
/// </summary>
public class RoleInfor
{
public string id { get; set; }
public string roleName { get; set; }
public int roleAge { get; set; }
}

分享表配置文件代码:

     /// <summary>
/// UserInfor实体对应表的配置
/// </summary>
class UserInforConfig :EntityTypeConfiguration<UserInfor>
{
public UserInforConfig()
{
this.ToTable("T_UserInfor");
this.HasKey<string>(u => u.id).Property(u => u.id).HasColumnType("varchar").HasMaxLength();
this.Property(u => u.userName).HasColumnType("varchar").HasMaxLength();
this.Property(u => u.userAge).HasColumnType("int").IsRequired();
}
}
/// <summary>
/// RoleInfor实体对应表的配置
/// </summary>
class RoleInforConfig : EntityTypeConfiguration<RoleInfor>
{
public RoleInforConfig()
{
this.ToTable("T_RoleInfor");
this.HasKey<string>(u => u.id).Property(u => u.id).HasColumnType("varchar").HasMaxLength();
this.Property(u => u.roleName).HasColumnType("varchar").HasMaxLength();
this.Property(u => u.roleAge).HasColumnType("int").IsRequired();
}
}

3. 在【Ypf.Service】类库中新建EF上下文 “YpfContext”类,使用EF的默认初始化策略(DB不存在则创建,实体不对应则报错) ,然后override OnModelCreating方法,并通过反射一次性加载EF的所有Fluent Api配置,最后声明要映射的实体。

 分享EF上下文的代码

  public class YpfContext:DbContext
{
/// <summary>
/// 继承父类构造函数,ypfConnectionString代表配置文件中连接字符串的名字
/// </summary>
public YpfContext():base("name=ypfConnectionString")
{
} /// <summary>
/// OnModelCreating方法重写,FluentAPI对表的配置都是在该方法中,但是当表数量多的话
/// 该方法内部就会显得特别乱,所以我们这里采用分离的方式,一张表对应一个配置文件类,
/// 最后全部注册到该方法中即可
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder); //1. 分开注册
//modelBuilder.Configurations.Add(new UserInforConfig());
//modelBuilder.Configurations.Add(new RoleInforConfig()); //2. 一次性加载所有Fluent API的配置
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
} public DbSet<UserInfor> UserInfor { get; set; }
public DbSet<RoleInfor> RoleInfor { get; set; }
}

4. 给【Ypf.Test】配置数据库连接字符串,并且进行一个简单的数据库查询操作,会发现在SQLServer默认目录生成一个名为“FrameFluentApiDB”的数据库,且表、字段对应均正确。

 分享数据库连接字符串代码:

  <connectionStrings>
<add name="ypfConnectionString" connectionString="Data Source=localhost;Initial Catalog=FrameFluentApiDB;User ID=sa;Password=123456" providerName="System.Data.SqlClient" />
</connectionStrings>

分享简单的数据库查询代码:

  class Program
{
static void Main(string[] args)
{
using (YpfContext db=new YpfContext())
{
var list = db.UserInfor.ToList(); Console.WriteLine("创建成功");
Console.ReadKey();
}
}
}

 运行后生成的数据库:

5. 给UserInfor实体增加一个“userSex”属性,并在UserInforConfig文件中对该属性进行配置,如下图,再次运行代码,报错,提示上下文发生改变,请走数据迁移。

修改后代码:

报错提示:

PS:配置数据迁移策略固然可以解决该问题,但我们这里用一种比较笨的方法,关闭数据库初始化策略,然后手动配置代码和修改数据库字段进行对应即可。

 分享关闭数据库初始化策略的代码:

手动修改数据库和代码实体中的属性对应后重新运行代码,运行成功。

!

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

第六节:框架搭建之EF的Fluent Api模式的使用流程的更多相关文章

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

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

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

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

  3. EF Core Fluent API

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

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

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

  5. 框架搭建与EF常用基类实现

    前两篇简单谈了一些.Net Core的优势以及机构设计的一些思路,这一篇开始,我们将从零开始搭建架构,底层我们将采用EF来访问数据库,所以这篇我们将贴一下EF常用操作的基类. 简单介绍下一些类库将要实 ...

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

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

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

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

  8. 【EF】CodeFirst Fluent API使用记录

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

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

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

随机推荐

  1. 如何设置非管理员用户配置特定的IIS站点

    如何设置非管理员用     户配置特定的IIS站点 一.           添加IIS管理服务 二.           启动管理服务 勾选启用远程连接后.点右边的应用 三.           设 ...

  2. Git与SVN交叉使用

    将本地git项目添加到远程svn中 git svn [svnprojpath] svnprojpath为原创svn项目路径 -- 文件夹路径,你要放到哪个文件夹 官方文档中带有-s参数,但我这边加了会 ...

  3. Ambari——大数据平台的搭建利器之进阶篇

    前言 本文适合已经初步了解 Ambari 的读者.对 Ambari 的基础知识,以及 Ambari 的安装步骤还不清楚的读者,可以先阅读基础篇文章<Ambari——大数据平台的搭建利器>. ...

  4. Ubuntu 安装 Docker CE(社区版)

    参考自 https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html#ubuntu-1604- docker-io 是以前早期的版本,版本 ...

  5. 前端——DOM

    什么是DOM? DOM是W3C(万维网联盟)的标准,是Document Object Model(文档对象模型)的缩写,它定义了访问HTML和XML文档的标准: “W3C文档对象模型(DOM)是中立于 ...

  6. 2019-03-23 shell练习,日志统计

    [2019-03-10 17:44:55]1234567 paid 10 10000 cat test.txt |tail -n +1 |sed 's/]/ ]g' |awk '{count[$3]+ ...

  7. 通过C#学Proto.Actor模型》之Remote

    Proto.Actor中提供了基于tcp/ip的通迅来实现Remote,可以通过其Remot实现对Actor的调用. 先来看一个极简单片的远程调用. 码友看码: 引用NuGet包 Proto.Acto ...

  8. .Net Core应用框架Util介绍(四)

    上篇介绍了Util Angular Demo的目录结构和运行机制,本文介绍Util封装Angular的基本手法及背后的动机. Angular应用由Ts和Html两部分构成,本文介绍第一部分. Angu ...

  9. VS2010创建MVC4项目提示错误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral,

    在安装VS2010时没有安装MVC4,于是后面自己下载安装了(居然还要安装VS2010 SP1补丁包).装完后新建MVC项目时却提示: 错误: 此模板尝试加载组件程序集 “NuGet.VisualSt ...

  10. Array.prototype.reduce()

    reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. arr.reduce([callback, initialValue]) c ...