一. EF简介

1. 定义

  Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台的数据访问技术,它还是一种对象关系映射器(ORM),它使.NET 开发人员能够使用面向对象的思想处理数据库, 它消除了开发人员通常需要编写大量数数据访问代码的需要。

2. 几点说明

(1). EF Core 是一个 .NET Standard 2.0 库,因此它能够在其它平台使用

(2). 安装.NET Core SDK 即可使用

(3). EF Core 可以在 Xamarin 和.NET Native 等其他.NET 实现上运行

(4). 不同数据库需要 EF Core 数据库提供程序支持

3. 相关的程序集(asp.net core中均已经内置,无须再安装)

(1). 基础程序集

  Microsoft.EntityFrameworkCore

  Microsoft.EntityFrameworkCore.Design

  Microsoft.EntityFrameworkCore.Tools

(2). 由微软维护的支持程序

  Microsoft.EntityFrameworkCore.SqlServer

  Microsoft.EntityFrameworkCore.Sqlite

  Microsoft.EntityFrameworkCore.InMemory

二. CodeFirst模式连接SQLite数据库

1. 通过Nuget安装:【Microsoft.EntityFrameworkCore.Sqlite】,该程序集Asp.Net Core中默认不包含,所以需要手动安装,这里安装2.2.0版本。

2. 新建UserInfor类和RoleInfor类,新建YpfDbContext上下文,直接在上下文里配置数据库连接字符串 如: optionsBuilder.UseSqlite(@"Data Source=DB/YpfDb.db");

   public class UserInfor
{
public string id { get; set; }
public string userName { get; set; }
public string userSex { get; set; }
}
public class RoleInfor
{
public string id { get; set; }
public string roleName { get; set; }
public string roleDescription { get; set; }
}
/// <summary>
/// EF Core上下文
/// </summary>
public class YpfDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(@"Data Source=DB/YpfDb.db");
base.OnConfiguring(optionsBuilder);
}
public DbSet<UserInfor> UserInfors { get; set; }
public DbSet<RoleInfor> RoleInfors { get; set; }
}

3. 通过命令:

(1). Add-Migration xxxx (xxx随意)迁移搭建基架,以便为模型创建一组初始表→发现生成一个Migrations文件夹,里面有两个类

(2). Update-Database 命令创建数据库并向其应用新的迁移→发现在DB文件夹下生成一个YpfDb.db的数据库文件

PS:上述指令必须是在安装了【Microsoft.EntityFrameworkCore.Tools】程序集的前提先才好用。

4. 执行下面的TestSQliteCRUD方法对数据库进行操作

        public async void TestSQliteCRUD()
{
using (DbContext db = new YpfDbContext())
{
//1.新增
UserInfor userInfor = new UserInfor()
{
id = Guid.NewGuid().ToString("N"),
userName = "ypf",
userSex = "男"
};
await db.Set<UserInfor>().AddAsync(userInfor);
int count = await db.SaveChangesAsync();
Console.WriteLine($"成功插入{count}条数据"); //2.查询
List<UserInfor> uList = db.Set<UserInfor>().ToList();
foreach (var item in uList)
{
Console.WriteLine($"id为:{item.id},名字为:{item.userName},性别为:{item.userSex}");
} }
}

5. 安装SQLite Studio查看该数据库中信息

改进:这里数据库连接字符串直接写在YpfDbContext中,显然是不合理的,我们采用依赖注入的方式进行改造

1. 新建YpfDbContext2类,利用构造函数传值

2. 把数据库链接字符串写到appsettings.json中

3. 在Startup类中的ConfigureServices类中注册EF上下文服务

  services.AddDbContext<YpfDbContext2>(options=>options.UseSqlite(Configuration.GetConnectionString("EFStr")));

4. 在下面控制器中利用构造函数注入EF Core上下文,在TestSQliteCRUD2方法中进行测试。

代码分享: 

 public class YpfDbContext2 : DbContext
{
public YpfDbContext2(DbContextOptions<YpfDbContext2> options) : base(options)
{ }
public DbSet<UserInfor> UserInfors { get; set; }
public DbSet<RoleInfor> RoleInfors { get; set; }
}

三. CodeFirst模式连接SQLServer数据库

1. 新建UserInfor、RoleInfor类,新建YpfDbContext类,利用构造函数传值。

   public class UserInfor
{
public string id { get; set; }
public string userName { get; set; }
public string userSex { get; set; }
}
public class RoleInfor
{
public string id { get; set; }
public string roleName { get; set; }
public string roleDescription { get; set; }
}
public class YpfDbContext : DbContext
{
public YpfDbContext(DbContextOptions<YpfDbContext> options) : base(options)
{ }
public DbSet<UserInfor> UserInfors { get; set; }
public DbSet<RoleInfor> RoleInfors { get; set; }
}

2. 把数据库链接字符串写到appsettings.json中

{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"EFStr": "Server=localhost;Database=dbCore1;User ID=sa;Password=123456;"
}
}

3. 在Startup类中的ConfigureServices类中注册EF上下文服务

  services.AddDbContext<YpfDbContext>(option => option.UseSqlServer(Configuration.GetConnectionString("EFStr")));

4. 新建一个“视图使用EF的控制器”,选择实体为UserInfor,则生成带增删改查的UserInforsController

PS:默认是通过依赖注入的方式向控制器中传递EF上下文

5. 通过命令

(1). Add-Migration xxxx (xxx随意)迁移搭建基架,以便为模型创建一组初始表→发现生成一个Migrations文件夹,里面有两个类

(2). Update-Database 命令创建数据库并向其应用新的迁移→打开SQLSever,发现多了个dbCore1的数据库

6. 访问https://localhost:44383/ 进行增删改查测试

四. DBFirst模式连接SQLServer数据库

假设上述三中的数据库已经生成了,我们通过数据库来反生成代码

1. 通过以下命令在Models文件夹里生成dbCore1Context上下文类和全部的实体类

  Scaffold-DbContext "Server=localhost;Database=dbCore1;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

我们会发现,默认的指令会有很多问题,比如生成的实体属性首字母全部大写了,表名如果有_符号,默认就给省略了,很不友好,所以下面详细分析一下指令。

详细指令分析:

【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -UseDatabaseNames -Context ypfContext】

①. -ContextDir DbContext : 代表EF上下文类放在DbContex文件夹的目录下

②. -OutputDir Models:代表所有的实体类放在Models文件夹的目录下

③. -UseDatabaseNames:代表完全按照数据库中表名或字段来映射生成相应的实体

④. -Context ypfContext:代表指定EF上下文的名称为“ypfContext”,默认的生成规则是:  数据库名+Context

继续补充非必要的配置:

【Scaffold-DbContext "Server=localhost;Database=MagicDB;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -UseDatabaseNames -Context ypfContext -DataAnnotations -Tables SysOperLogInfor,SysUserInfor】

①. -DataAnnotations: 代表用数据注解的形式配置实体类属性,默认用的是FluentApi的形式进行配置。

②. -Tables SysOperLogInfor,SysUserInfor:表示仅映射SysOperLogInfor,SysUserInfor两张表。

更新配置:

①. 如果数据变动很小,那么我们完全可以手动的去改一下代码的配置即可。

②. 如果数据库修改内容多,手动修改代码配置会很麻烦,这个时候我们使用指令 【-Force】再次映射,即覆盖了原先的代码配置映射。

覆盖的完整版的指令:

【Scaffold-DbContext "Server=localhost;Database=MagicDB;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -UseDatabaseNames -Context ypfContext -DataAnnotations -Tables SysOperLogInfor,SysUserInfor -Force】

2. 注释掉dbCore1Context中的OnConfiguring方法中直连数据的模式,利用构造函数进行改造(默认已经有了)

3. 把数据库链接字符串写到appsettings.json中(同上)

4. 在Startup类中的ConfigureServices类中注册EF上下文服务

  services.AddDbContext<dbCore1Context>(option => option.UseSqlServer(Configuration.GetConnectionString("EFStr")));

5. 新建一个“视图使用EF的控制器”,选择实体为RoleInfor,则生成带增删改查的RoleInforsController(同上)

6. 通过访问https://localhost:44318/进行测试。

!

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

第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)的更多相关文章

  1. MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

    dotnet core 2.0 发布已经好几天了,期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0,升级过程还是比较顺利的,变动也不是太多.升级的过程中也少不了 Enti ...

  2. Android精通教程-第一节Android入门简介

    前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...

  3. EntityFramework Core 2.0自定义标量函数两种方式

    前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...

  4. 简介C#读取XML的两种方式

    简介C#读取XML的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-03 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的 ...

  5. IIS在ASP.NET Core下的两种部署模式

    KestrelServer最大的优势体现在它的跨平台的能力,如果ASP.NET CORE应用只需要部署在Windows环境下,IIS也是不错的选择.ASP.NET CORE应用针对IIS具有两种部署模 ...

  6. thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用。第二种架构模式两个单入口文件,分别生成两个应用定义define。。。函数可以定义配置文件。。。。

    thinkphp 的两种建构模式  第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用. ...

  7. EF Core系列

    一. 二. 三. 系列章节 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例) 第X节:XXXXXXXXXXXXXXXXXXXXXXX ...

  8. EF Core中避免贫血模型的三种行之有效的方法(翻译)

    Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...

  9. ef core中如何实现多对多的表映射关系

    文档:https://docs.microsoft.com/en-us/ef/core/modeling/relationships class MyContext : DbContext { pub ...

随机推荐

  1. 好代码是管出来的——.Net中的代码规范工具及使用

    上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理. 本文主要内容有: Roslyn简介 开发基于Roslyn的代码分析器 常用的基于Roslyn的代码分析器 在.N ...

  2. 快速排序实现及其pivot的选取

    coursera上斯坦福的算法专项在讲到快速排序时,称其为最优雅的算法之一.快速排序确实是一种比较有效的排序算法,很多类库中也都采用了这种排序算法,其最坏时间复杂度为$O(n^2)$,平均时间复杂度为 ...

  3. yum 安装 python-pip 失败解决方法

    这个包在EPEL源里,要添加EPEL源才可以.然后按博客里说的方法添加,执行以下命令: sudo rpm -ivh epel-release* 第一种方式:由于epel在禁用列表里需要另外加参数yum ...

  4. android 6.0 Intent 安装apk闪退

    需求描述: 利用android系统自带的DownloadManager下载apk文件,并且打开安装界面. 问题描述: 关于DownloadManager的使用网上有很多例子,在此不啰嗦.下载完成之后在 ...

  5. ASP.NET Core部署在IIS上

    1.下载安装 Windows Server Hosting ,它的作用是,让IIS有反向代理功能(Asp.Net Core Module负责反向代理工作),将请求转发到 Kestrel 2.发布网站, ...

  6. Node.js如何执行cmd

    最近正好因业务的一个需求需要研究如何根据vscode的插件名来下载对应的插件以解决之前将插件打包上传到服务器上面导致的延迟问题(插件体积小还好说,如果体积过大,即便是压缩打成zip包,如果同一时刻很多 ...

  7. dump文件解析之探索.Net的内存

    前言: 对于需要长时间运行的.net程序,有时需要我们查看内存的使用有没有内存泄露问题. 我们可以从dump文件中找到答案. Dump的看点 用dump文件来分析内存,到底我们需要关心哪些点呢? 内存 ...

  8. Eclipse 从git导入maven多模块项目

    原文地址:https://blog.csdn.net/xiongyouqiang/article/details/78903975 以https://github.com/xiongyouqiang/ ...

  9. java基础-jdk工具包

    1. 标准工具 这些工具都是JDK提供的,通常都是长期支持的工具,JDK承诺这些工具比较好用.不同系统.不同版本之间可能会有差异,但是不会突然就有一个工具消失. 1.1 基础包 (extcheck, ...

  10. Python百题计划

    一.基础篇 想要像类似执行shell脚本一样执行Python脚本,需要在py文件开头加上什么?KEY:#!/usr/bin/env python Python解释器在加载 .py 文件中的代码时,会对 ...