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. codeblock安装及汉化教程

    1.双击图标 2.弹出如下对话框: 3.单击按钮Next,弹出如下对话框: 4.单击按钮I Agree,弹出如下对话框: 5.单击按钮Next,弹出如下对话框: 6.单击Browse按钮,可以重新设置 ...

  2. PLC通过Modbus转Profinet网关连接变频器控制电机案例

    在本案例中,通过使用Modbus转Profinet网关(XD-MDPN100),PLC可以通过Profinet协议与变频器进行通信和控制.这样,PLC可以实现对电机的转速调节.启停控制等功能. 同时, ...

  3. 宏观上理解blazor中的表单验证

    概述 表单验证的最终效果大家都懂,这里不阐述了,主要从宏观角度说说blazor中表单验证框架涉及到的类,以及它们是如何协作的,看完这个,再看官方文档也许能更轻松点. blazor中的验证框架分为两部分 ...

  4. 其它——DevOps简介

    文章目录 DevOps简介 DevOps的概念 历史变革 好处是什么? 为什么DevOps会兴起? 实现DevOps需要什么? DevOps的采用现状 DevOps简介 DevOps 是一个完整的面向 ...

  5. torch.nn.ReLU(inplace=True)的具体含义:

    首先根据源文档中的ReLU(x)=max(0,x),得出结论.大于0的数值不变,小于0的数据变成0. 补充:这里需要注意的是 ReLU并没有限制数据的大小. 这是对应的文档链接:https://pyt ...

  6. [NSSRound#1 Basic]basic_check

    打开网站,发现啥也没有: 就用dirsearch扫了一遍.发现还是没有有用信息: 只有再另找方法: 再用nikto扫一次: 发现一个put方法,就用put上传一个一句话木马:可以用插件restlien ...

  7. 飞码LowCode前端技术系列(一):数据结构设计

    简介 飞码是京东科技研发的低代码产品,可使营销运营域下web页面快速搭建.飞码是单web页面搭建工具,从创建页面到监测再到投产的一站式解决方案.会通过七篇文章介绍飞码,分别是:(1)背景与数据结构设计 ...

  8. 【KMP】border 题解

    题目描述 输入 输出 样例输入 abaabaa 样例输出 17 样例解释: f[2][a] = 1 f[3][a] = 1 f[4][a] = 1 f[4][b] = 2 f[5][a] = 1 f[ ...

  9. centos7通过yum安装mysql5.7以上版本

    1.检查并卸载mariadb yum remove *mariadb* 遇到要求输入直接y/n 直接输入y回车 2.下载并安装mysql mysql源地址:https://repo.mysql.com ...

  10. SNN_LIF模型

    LIF模型 Leaky integrity-Fire(LIF)模型 输入信号直接影响神经元的状态,即神经元膜电位,只有当膜电位上升到阈值的时候,才会产生输出信号. 膜电位:细胞膜两侧的电位差.只有当膜 ...