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#代码

    4. 执行命令

      Update-database

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

    5. 查看 sql server 数据库是否执行成功
    6. 如果添加或修改字段,重复执行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);

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

  1. 基于EF Core的Code First模式的DotNetCore快速开发框架

    前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...

  2. 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持

    前言 距离上一篇文章<基于EF Core的Code First模式的DotNetCore快速开发框架>已过去大半个年头,时光荏苒,岁月如梭...比较尴尬的是,在这大半个年头里,除了日常带娃 ...

  3. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  4. EF Core 的 Code First 模式

    0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...

  5. EF Core学习Code First

    下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...

  6. EF Core的Code First 基础

    一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...

  7. EF Core DBFirst和CodeFirst 模式使用方法

    一.安装依赖包 1.Microsoft.EntityFrameworkCore 2.Microsoft.EntityFrameworkCore.Tools 3.Microsoft.EntityFram ...

  8. NET Core 使用EF Core的Code First迁移和DBFirst

    DBFirst (1)Microsoft.EntityFrameworkCore (2)Microsoft.EntityFrameworkCore.Design (3)Microsoft.Entity ...

  9. EF 下的code fist 模式编程

    EF 分两种模式 codefirst(就是不知道数据是啥,也没有数据库)  和 database fist (数据已经设计好了) 首先打开vs  新建一个项目 创建一个控制台程序 然后 新建一个Tea ...

  10. EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构

    前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下 ...

随机推荐

  1. 用OLED屏幕播放视频(1): 项目介绍

    下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这篇文章主要对项目的实现做整体的介绍, 包括硬 ...

  2. JDK8升级JDK11最全实践干货来了

    1.前言 截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本.那么从JDK8到JDK11,到底带来了哪些特性呢 ...

  3. WebApi中添加Jwt鉴权

    前言 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息.一个 JWT 实际上就是一个字符串,它由三部分组成,头部.载荷与签 ...

  4. 手动实现Transformer

      Transformer和BERT可谓是LLM的基础模型,彻底搞懂极其必要.Transformer最初设想是作为文本翻译模型使用的,而BERT模型构建使用了Transformer的部分组件,如果理解 ...

  5. Kubeflow基础知识

    kubeflow 基础知识 kubeflow 简介 kubeflow是谷歌开源的MLOps开源平台,其中包含的不同组件代表了机器学习生命周期的不同阶段. 下图是kubeflow组织ML工作流程: ku ...

  6. ModelScope

    欢迎来到ModelScope平台!本篇文章介绍如何快速开始使用ModelScope平台上的模型,包括所需的基础概念,环境安装,模型推理和训练的快速实践示例. 如何开始# 如果你是新手,想快速体验产品, ...

  7. 使用 Ant Design Vue 你可能会遇到的14个问题

    公司有一个新需求,在原来项目基础上开发,项目中使用 Ant Design Vue,版本是 1.X ,在此记录下遇到的问题:对于没有使用过或者使用程度不深的同学来说,希望可以帮助你在开发中遇到问题时有个 ...

  8. QT(7)-初识委托

    @ 目录 1 简介 2 QT中的委托类 2.1 函数 2.1.1 关键函数 2.1.2 其他函数 3 例子 3.1 官方例子 3.2 修改官方例子 4 设想 1 简介 委托是Qt中的一种机制,用于在Q ...

  9. JavaScript 语法:运算符号

    作者:WangMin 格言:努力做好自己喜欢的每一件事 JavaScript要进行各种各样的运算,就要使用不同的运算符号. JavaScript 算数运算符 算数运算符用于对数字执行算数运算,分别有以 ...

  10. 在Linux平台下使用.NET Core访问Access数据库读取mdb文件数据

    在 Linux平台下使用 .NET Core 访问 Access数据库 读取 mdb文件 数据 今天有群友在群里问 C# 能不能在 Linux 下访问 Access数据库? 我觉得这很有趣,因此研究折 ...