第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)

一. 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");

 1   public class UserInfor
 2     {
 3         public string id { get; set; }
 4         public string userName { get; set; }
 5         public string userSex { get; set; }
 6     }
 7   public class RoleInfor
 8     {
 9         public string id { get; set; }
10         public string roleName { get; set; }
11         public string roleDescription { get; set; }
12     }
13     /// <summary>
14     /// EF Core上下文
15     /// </summary>
16     public class YpfDbContext : DbContext
17     {
18         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
19         {
20             optionsBuilder.UseSqlite(@"Data Source=DB/YpfDb.db");
21             base.OnConfiguring(optionsBuilder);
22         }
23         public DbSet<UserInfor> UserInfors { get; set; }
24         public DbSet<RoleInfor> RoleInfors { get; set; }
25     }

3. 通过命令:

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

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

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

 1        public async void TestSQliteCRUD()
 2         {
 3             using (DbContext db = new YpfDbContext())
 4             {
 5                 //1.新增
 6                 UserInfor userInfor = new UserInfor()
 7                 {
 8                     id = Guid.NewGuid().ToString("N"),
 9                     userName = "ypf",
10                     userSex = ""
11                 };
12                 await db.Set<UserInfor>().AddAsync(userInfor);
13                 int count = await db.SaveChangesAsync();
14                 Console.WriteLine($"成功插入{count}条数据");
15 
16                 //2.查询
17                 List<UserInfor> uList = db.Set<UserInfor>().ToList();
18                 foreach (var item in uList)
19                 {
20                     Console.WriteLine($"id为:{item.id},名字为:{item.userName},性别为:{item.userSex}");
21                 }
22 
23             }
24         }

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方法中进行测试。

代码分享: 

1 public class YpfDbContext2 : DbContext
2     {
3         public YpfDbContext2(DbContextOptions<YpfDbContext2> options) : base(options)
4         {
5 
6         }
7         public DbSet<UserInfor> UserInfors { get; set; }
8         public DbSet<RoleInfor> RoleInfors { get; set; }
9     }

三. CodeFirst模式连接SQLServer数据库

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

 1   public class UserInfor
 2     {
 3         public string id { get; set; }
 4         public string userName { get; set; }
 5         public string userSex { get; set; }
 6     }
 7   public class RoleInfor
 8     {
 9         public string id { get; set; }
10         public string roleName { get; set; }
11         public string roleDescription { get; set; }
12     }
13  public class YpfDbContext : DbContext
14     {
15         public YpfDbContext(DbContextOptions<YpfDbContext> options) : base(options)
16         {
17 
18         }
19         public DbSet<UserInfor> UserInfors { get; set; }
20         public DbSet<RoleInfor> RoleInfors { get; set; }
21     }

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

PS:仅映射RoleInfor表

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

特别注意:这里的需要在表实体后面加个s才能映射出来

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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2019-04-09 11:20 Yaopengfei 阅读(...) 评论(...) 编辑 收藏