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

EF Core Code First 是什么
Code First 是 Entity Framework Core (简称 EF Core) 的一种开发模式,它允许开发人员使用纯粹的代码来定义数据模型,通过它,可以极大地提高开发效率:
- 使用 Code First 开发模式,你可以专注于定义领域模型和业务逻辑,而无需关注数据库的细节,能够更快地构建应用程序
- Code First 是真正地面向对象的方式来定义数据模型,包括实体类、关系、继承等,这些都让数据模型的设计更加直观和易于理解
- Code First 支持多种数据库,包括 SQL Server、MySQL、PostgreSQL 等,你可以在不同的数据库之间进行切换而无需修改代码
- Code First 提供了数据库迁移工具,可以根据模型变化自动创建、更新和维护数据库模式,数据库的版本控制和迁移变得更加容易,也减少了手动编写 SQL 脚本的工作量
Step By Step 使用 Code First 步骤
- 创建一个 asp.net core Console 项目
- 从 Nuget 安装以下包
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools - 创建实体类 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; }
}
- 创建实现了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();
}
}
- 创建一个继承自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);
}
}
- 迁移(根据实体类生成数据库表)
- 打开 菜单 - 工具 - 程序包管理器控制台
- 默认项目下拉框选择目标项目【可选,如果解决方案有多个项目】
- 执行如下命令:
Add-Migration InitialCreate 【InitialCreate 名字可随意取,有意义就好】
说明:Add-Migration命令会自动在项目的Migrations文件夹中生成C#代码 - 执行命令
Update-database
说明:编译并且执行数据库迁移代码 - 查看 sql server 数据库是否执行成功
- 如果添加或修改字段,重复执行3~4步命令
- 至此,EF Core 的 Code First 过程已经完成,接着就可以对数据进行增删改查等操作
扩展 - Fluent API 基本语法例子
- 视图与实体类映射
modelBuilder.Entity<Blog>().ToView("blogsView");
- 排除属性映射
modelBuilder.Entity<Blog>().Ignore(b => b. Name2);
- 数据库表列名
modelBuilder.Entity<Blog>().Property(b =>b.BlogId).HasColumnName("blog_id");
- 列数据类型
builder.Property(e => e.Title) .HasColumnType("varchar(200)")
- 主键
modelBuilder.Entity<Student>().HasKey(c => c.Number);
- 索引
modelBuilder.Entity<Blog>().HasIndex(b => b.Url); // 复合索引
modelBuilder.Entity<Person>().HasIndex(p => new { p.FirstName, p.LastName });
- 多对多
builder.HasMany<Teacher>(c => c.Teachers).WithMany(t => t.Students)
.UsingEntity(j => j.ToTable("T_Students_Teachers"));
- 1对多
builder.HasOne<Article>(c =>c.Article)
.WithMany(a => a.Comments)
.IsRequired()
.HasForeignKey(c => c.ArticleId);
- 1对1
builder.HasOne<Delivery>(c => c.Delivery).WithOne(d => d.Order)
.HasForeignKey<Delivery>(d => d.OrderId);
不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你的更多相关文章
- 基于EF Core的Code First模式的DotNetCore快速开发框架
前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...
- 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持
前言 距离上一篇文章<基于EF Core的Code First模式的DotNetCore快速开发框架>已过去大半个年头,时光荏苒,岁月如梭...比较尴尬的是,在这大半个年头里,除了日常带娃 ...
- 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,这种形 ...
- EF Core 的 Code First 模式
0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...
- EF Core学习Code First
下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...
- EF Core的Code First 基础
一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...
- EF Core DBFirst和CodeFirst 模式使用方法
一.安装依赖包 1.Microsoft.EntityFrameworkCore 2.Microsoft.EntityFrameworkCore.Tools 3.Microsoft.EntityFram ...
- NET Core 使用EF Core的Code First迁移和DBFirst
DBFirst (1)Microsoft.EntityFrameworkCore (2)Microsoft.EntityFrameworkCore.Design (3)Microsoft.Entity ...
- EF 下的code fist 模式编程
EF 分两种模式 codefirst(就是不知道数据是啥,也没有数据库) 和 database fist (数据已经设计好了) 首先打开vs 新建一个项目 创建一个控制台程序 然后 新建一个Tea ...
- EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构
前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下 ...
随机推荐
- MapReduce核心概念及架构
MapReduce简介 MapReduce常用于对大规模数据集(大于1TB)的并行运算,或对大数据进行加工.挖掘和优化等处理. MapReduce将并行计算过程高度抽象到了两个函数map和reduce ...
- CentOS 8 无痕升级到 Rocky Linux
CentOS 8 无痕升级到 Rocky Linux 1.升级当前系统 dnf upgrade -y 2.重启当前系统: reboot 3.下载脚本: CentOS 8 到 Rocky Linux 8 ...
- Kafka Stream 高级应用
9.1将Kafka 与其他数据源集成 对于第一个高级应用程序示例,假设你在金融服务公司工作.公司希望将其现有数据迁移到新技术实现的系统中,该计划包括使用 Kafka.数据迁移了一半,你被要求去更新公司 ...
- JS深入学习笔记 - 第一章.构造函数原型与原型链
1.构造函数和原型 1.1 概述 在典型的 OOP语言中(如Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在ES6之前,JS并没有引入类的概念. 在ES6之前,对象不是基于类创建的 ...
- 如何随心所欲调试HotSpot VM源代码?(改造为CMakeLists项目)
常有小伙伴问我是怎么调试HotSpot VM源代码的,我之前通过视频和文章介绍过一种大家都用的调试方法,如下: 文章地址:第1.2篇-调试HotSpot VM源代码(配视频) 视频地址:https:/ ...
- 在 Net7.0环境下测试了 Assembly.Load、Assmebly.LoadFile和Assembly.LoadFrom的区别
一.简介 很长时间没有关注一些C#技术细节了,主要在研究微服务.容器.云原生.编批等高大上的主题了,最近在写一些框架的时候,遇到了一些和在 Net Framework 框架下不一样的情况,当然了,我今 ...
- mysql 管理员常用命令
1.创建用户 create user admin@localhost identified by 'password'; 2.赋权 grant privileges ON database.table ...
- 【matplotlib基础】--3D图形
matplotlib 在1.0版本之前其实是不支持3D图形绘制的. 后来的版本中,matplotlib加入了3D图形的支持,不仅仅是为了使数据的展示更加生动和有趣.更重要的是,由于多了一个维度,扩展了 ...
- Python面向对象——封装
文章目录 内容回顾 封装 为何要隐藏? 作业 内容回顾 上节课复习: 1.编程范式/思想 面向过程 介绍: 核心是"过程"二字 过程就是"流水线" 过程终极奥义 ...
- UVA908[Re-connecting Computer Sites]题解
原题 1.题意分析 题意就是给你很多组数,对于每组数,有三组小数据.第一组小数据先输入一个n表示顶点数,然后再输入n-1条边表示初始边数.其它组小数据先输入一个数k,表示增加的边的数量,然后再输入k条 ...