不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你

EF Core Code First 是什么

Code First 是 Entity Framework Core (简称 EF Core) 的一种开发模式,它允许开发人员使用纯粹的代码来定义数据模型,通过它,可以极大地提高开发效率:

  1. 使用 Code First 开发模式,你可以专注于定义领域模型和业务逻辑,而无需关注数据库的细节,能够更快地构建应用程序
  2. Code First 是真正地面向对象的方式来定义数据模型,包括实体类、关系、继承等,这些都让数据模型的设计更加直观和易于理解
  3. Code First 支持多种数据库,包括 SQL Server、MySQL、PostgreSQL 等,你可以在不同的数据库之间进行切换而无需修改代码
  4. Code First 提供了数据库迁移工具,可以根据模型变化自动创建、更新和维护数据库模式,数据库的版本控制和迁移变得更加容易,也减少了手动编写 SQL 脚本的工作量

Step By Step 使用 Code First 步骤

  1. 创建一个 asp.net core Console 项目
  2. 从 Nuget 安装以下包

Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore.Tools

3.创建实体类 Article 和 Comment

public class Article
{
  /// <summary>
  /// 主键
  /// </summary>
  public long Id { get; set; }
  /// <summary>
  /// 标题
  /// </summary>
  public string Title { get; set; }
  /// <summary>
  /// 内容
  /// </summary>
  public string Content { get; set; }
  /// <summary>
  /// 此文章的若干条评论
  /// </summary>
  public List<Comment> Comments { get; set; } = new List<Comment>(); 
}
public class Comment
{
  public long Id { get; set; }
  public Article Article { get; set; }
  public long ArticleId { get; set; }
  public string Message { get; set; }
}

4.创建实现了IEntityTypeConfiguration接口的实体类的配置类,用于配置实体类和数据库表的对应关系

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
// IEntityTypeConfiguration的泛型参数类指定这个类要对实体类 Article 进行配置
class ArticleConfig : IEntityTypeConfiguration<Article>
{
  // 使用Fluent API的方式对实体类进行配置
  // 也可以在实体类中使用 Data Annotation 进行配置,但那样耦合太深,不推荐使用
  public void Configure(EntityTypeBuilder<Article> builder)
  {
    
    // 表示这个实体类对应数据库中名字为T_Articles的表
    builder.ToTable("T_Articles");
    builder.Property(p => p.Content).IsRequired().IsUnicode();
    builder.Property(p => p.Title).IsRequired().IsUnicode()
      .HasMaxLength(255);
  }
}
class CommentConfig : IEntityTypeConfiguration<Comment>
{
  public void Configure(EntityTypeBuilder<Comment> builder)
  {
    builder.ToTable("T_Comments");
    // 一条评论对应一篇文章,一篇文章有多条评论
    builder.HasOne<Article>(c =>c.Article)
      .WithMany(a => a.Comments)
      .IsRequired()
      .HasForeignKey(c => c.ArticleId);
    builder.Property(p=>p.Message).IsRequired().IsUnicode();
  }
}

5.创建一个继承自DbContext类的TestDbContext类(上下文类)

using Microsoft.EntityFrameworkCore;
class TestDbContext: DbContext
{
  public DbSet<Article> Articles { get; set; }
  public DbSet<Comment> Comments { get; set; }
  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    string connStr = "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true";
    optionsBuilder.UseSqlServer(connStr);
  }
  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {
    base.OnModelCreating(modelBuilder);
    // 表示加载当前程序集中所有实现了IEntityTypeConfiguration接口的类
    modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
  }
}

6.迁移(根据实体类生成数据库表)

  1. 打开 菜单 - 工具 - 程序包管理器控制台
  2. 默认项目下拉框选择目标项目【可选,如果解决方案有多个项目】
  3. 执行如下命令:

Add-Migration InitialCreate 【InitialCreate 名字可随意取,有意义就好】

说明:Add-Migration命令会自动在项目的Migrations文件夹中生成C#代码

  1. 执行命令

Update-database

说明:编译并且执行数据库迁移代码

  1. 查看 sql server 数据库是否执行成功
  2. 如果添加或修改字段,重复执行3~4步命令

7.至此,EF Core 的 Code First 过程已经完成,接着就可以对数据进行增删改查等操作

扩展 - Fluent API 基本语法例子

  1. 视图与实体类映射
modelBuilder.Entity<Blog>().ToView("blogsView");

2.排除属性映射

modelBuilder.Entity<Blog>().Ignore(b => b. Name2);

3.数据库表列名

modelBuilder.Entity<Blog>().Property(b =>b.BlogId).HasColumnName("blog_id");

4.列数据类型

builder.Property(e => e.Title) .HasColumnType("varchar(200)")

5.主键

modelBuilder.Entity<Student>().HasKey(c => c.Number);

6.索引

modelBuilder.Entity<Blog>().HasIndex(b => b.Url);
// 复合索引
modelBuilder.Entity<Person>().HasIndex(p => new { p.FirstName, p.LastName });

7.多对多

builder.HasMany<Teacher>(c => c.Teachers).WithMany(t => t.Students)
  .UsingEntity(j => j.ToTable("T_Students_Teachers"));

8.1对多

builder.HasOne<Article>(c =>c.Article)
  .WithMany(a => a.Comments)
  .IsRequired()
  .HasForeignKey(c => c.ArticleId);

9.1对1

builder.HasOne<Delivery>(c => c.Delivery).WithOne(d => d.Order)
  .HasForeignKey<Delivery>(d => d.OrderId);


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
前端开发 .NET 数据安全/隐私保护
菜鸟入门【ASP.NET Core】15:MVC开发:ReturnUrl实现、Model后端验证 、Model前端验证
ReturnUrl实现 我们要实现returnUrl,我们需要在注册(Register)方法中接收传进的returnUrl并给它默认值null,然后将它保存在ViewData里面 然后我们定义一个内部方法来判断跳转returnUrl //内部跳转 private IActionR...
2549 0
|
11月前
|
开发框架 API C#
C#/.NET/.NET Core优秀项目和框架精选(23年10月更新,欢迎大家踊跃提交PR一起完善让优秀的项目和框架不被埋没)
C#/.NET/.NET Core优秀项目和框架精选(23年10月更新,欢迎大家踊跃提交PR一起完善让优秀的项目和框架不被埋没)
182 0
|
域名解析 前端开发 JavaScript
前端程序员搭建自己的CodeIDE(code-server教程)
前端程序员搭建自己的CodeIDE(code-server教程) 偶尔不能在自己电脑上写代码时,用用浏览器敲代码也挺方便;或者用平板刷刷算法题也挺有趣;测试JavaScript某一代码片段也不用在浏览器的控制台上打印输出了;
377 0
|
机器人 测试技术 Android开发
【第二篇】XiaoZaiMultiAutoAiDevices之基本使用
从一个框架,延伸各项知识点,补补基础,挺好~
132 0
html+css实战7-vs code的简介和使用
html+css实战7-vs code的简介和使用
135 0
html+css实战7-vs code的简介和使用
|
C++ Python
ROS入门笔记(十一):编写与测试简单的Service和Client (Python)
ROS入门笔记(十一):编写与测试简单的Service和Client (Python)
503 0
ROS入门笔记(十一):编写与测试简单的Service和Client (Python)
|
SQL 前端开发 .NET
一起谈.NET技术,领域驱动设计案例:Tiny Library:简介
  应广大网友的要求,我最近抽空基于ASP.NET MVC + WCF + Entity Framework做了一个案例,该案例以图书馆图书管理、读者借书、还书为业务背景,以领域驱动设计为思想指导,全程采用Microsoft技术进行实践,希望能够给Microsoft技术的狂热者以及领域驱动设计的学者提供实践参考。
1502 0
|
JSON .NET C#
.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入
作者:依乐祝原文链接:https://www.cnblogs.com/yilezhu/p/9998021.html 写在前面 上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目,同时又通过一个实战教你如何在页面显示一个Content的列表。
2215 0
|
测试技术 C# 开发工具
.NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了
 写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能。今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git命令上传到GitHub上,正好大家可以再次熟悉下Git命令的使用,来巩固上篇文章的知识。
1932 0