不会使用 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下 ...
随机推荐
- codeblock安装及汉化教程
1.双击图标 2.弹出如下对话框: 3.单击按钮Next,弹出如下对话框: 4.单击按钮I Agree,弹出如下对话框: 5.单击按钮Next,弹出如下对话框: 6.单击Browse按钮,可以重新设置 ...
- PLC通过Modbus转Profinet网关连接变频器控制电机案例
在本案例中,通过使用Modbus转Profinet网关(XD-MDPN100),PLC可以通过Profinet协议与变频器进行通信和控制.这样,PLC可以实现对电机的转速调节.启停控制等功能. 同时, ...
- 宏观上理解blazor中的表单验证
概述 表单验证的最终效果大家都懂,这里不阐述了,主要从宏观角度说说blazor中表单验证框架涉及到的类,以及它们是如何协作的,看完这个,再看官方文档也许能更轻松点. blazor中的验证框架分为两部分 ...
- 其它——DevOps简介
文章目录 DevOps简介 DevOps的概念 历史变革 好处是什么? 为什么DevOps会兴起? 实现DevOps需要什么? DevOps的采用现状 DevOps简介 DevOps 是一个完整的面向 ...
- torch.nn.ReLU(inplace=True)的具体含义:
首先根据源文档中的ReLU(x)=max(0,x),得出结论.大于0的数值不变,小于0的数据变成0. 补充:这里需要注意的是 ReLU并没有限制数据的大小. 这是对应的文档链接:https://pyt ...
- [NSSRound#1 Basic]basic_check
打开网站,发现啥也没有: 就用dirsearch扫了一遍.发现还是没有有用信息: 只有再另找方法: 再用nikto扫一次: 发现一个put方法,就用put上传一个一句话木马:可以用插件restlien ...
- 飞码LowCode前端技术系列(一):数据结构设计
简介 飞码是京东科技研发的低代码产品,可使营销运营域下web页面快速搭建.飞码是单web页面搭建工具,从创建页面到监测再到投产的一站式解决方案.会通过七篇文章介绍飞码,分别是:(1)背景与数据结构设计 ...
- 【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[ ...
- centos7通过yum安装mysql5.7以上版本
1.检查并卸载mariadb yum remove *mariadb* 遇到要求输入直接y/n 直接输入y回车 2.下载并安装mysql mysql源地址:https://repo.mysql.com ...
- SNN_LIF模型
LIF模型 Leaky integrity-Fire(LIF)模型 输入信号直接影响神经元的状态,即神经元膜电位,只有当膜电位上升到阈值的时候,才会产生输出信号. 膜电位:细胞膜两侧的电位差.只有当膜 ...