不会使用 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下 ...
随机推荐
- Vue源码学习(八):生命周期调用
好家伙, Vue源码学习(七):合并生命周期(混入Vue.Mixin) 书接上回,在上一篇中,我们已经实现了合并生命周期 现在,我们要在我们的初始化过程中,注册生命周期 1.项目目录 红框为本篇 ...
- 11G RAC 11.2.0.1.0实例evict故障处理
Aix 7.1 参考文档: https://blogs.oracle.com/database4cn/rac Resolving ORA-481 and "terminating the i ...
- 04-Shell字符串变量
1. 字符串变量的三种方式 字符串(String)就是一系列字符的组合.字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了) 单引号方式 双引号方式, 推荐 不用引号 ...
- 轻松掌握组件启动之MongoDB:快速入门、Linux安装和Docker配置指南
引言 我们将继续深入研究组件启动专题.在之前的文章中,我们已经详细介绍了Redis的各种配置使用方法,为读者提供了全面的指导.然而,今天我们将转向另一个备受关注的数据库--MongoDB.MongoD ...
- tunm二进制协议在python上的实现
tunm二进制协议在python上的实现 tunm是一种对标JSON的二进制协议, 支持JSON的所有类型的动态组合 支持的数据类型 基本支持的类型 "u8", "i8& ...
- 如何借助python第三方库存取不同应用程序的用户名、密码
在之前的一系列文章中,小爬分享了很多用Pywin32.uiAutomation.sap Gui Script等技术实现应用程序或者Web网站(如SAP.Excel.outLook邮件系统.OA系统)的 ...
- JavaScript:垃圾收集机制
JavaScript具有自动垃圾收集机制.也就是说,执行环境会负责管理代码执行过程中使用的内存.开发人员不必关心内存分配和回收问题. 垃圾收集机制的原理:找到不再继续使用的变量,然后进行释放其占用的内 ...
- vue3.0父级组件调用子组件方法
vue3.0父级组件调用子组件方法 场景:在页面开发过程中,我经常涉及到不同组件之间的元素和方法的调用.就此记录在vue3.0项目,也是我开发的开源项目中的实现方式. 父级组件调用子级 1.应用场景 ...
- HashMap源码详解
HashMap简介 HashMap是Java语言中的一种集合类,它实现了Map接口,用于存储Key-Value对.它基于哈希表数据结构,通过计算Key的哈希值来快速定位Value的位置,从而实现高效的 ...
- node版本依赖报错那些事儿
前言 昨天还能跑的的项目,今天就歇菜了 第一步 删除大法 依赖问题,那就把.lock/ node_modules 删除重新装 第二步 如果重装不好使,那就各种降低版本尝试 遇到这样的 有两种方式 1. ...