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

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

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

  1. 执行命令

Update-database

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

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


相关文章
|
消息中间件 XML 网络协议
『NLog』.Net使用NLog使用方式及详细配置(输出至文件/RabbitMQ/远程网络Tcp)
📣读完这篇文章里你能收获到 - Nlog输出至文件/RabbitMQ/远程网络Tcp配置文档 - Nlog配置参数详解 - .NET CORE项目接入
6853 0
『NLog』.Net使用NLog使用方式及详细配置(输出至文件/RabbitMQ/远程网络Tcp)
|
8月前
|
存储 缓存 应用服务中间件
Nginx缓存清除方法(手把手教你轻松清理Nginx缓存)
本文来源https://www.vps5.cn/介绍Nginx缓存清除的常用方法,包括删除缓存文件、使用ngx_cache_purge模块及设置过期时间,帮助开发者高效管理缓存,提升网站性能。
|
SQL 关系型数据库 数据库连接
详解 Entity Framework(EF)核心组件与数据访问方法探索
Entity Framework是一个ORM框架,简化.NET开发者与数据库的交互。它始于.NET Framework的一部分,但现在可通过NuGet独立获取。ORM允许对象模型直接映射到数据库结构,避免直接编写SQL。
2776 2
详解 Entity Framework(EF)核心组件与数据访问方法探索
|
前端开发 Linux C#
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
1902 10
Vue3.0+ts填坑 warning Unexpected any报类型警告
Vue3.0+ts填坑 warning Unexpected any报类型警告
491 0
|
API Docker 微服务
Ocelot集成Consul实现api网关与服务发现
本文介绍了如何在.NET微服务架构中集成API网关Ocelot和Consul服务发现。首先通过Docker安装并配置Consul,接着在GoodApi项目中实现服务的自动注册与注销,并配置健康检查。然后,通过修改Ocelot的配置文件`ocelot.json`和`Program.cs`,实现基于Consul的服务发现,确保API请求能够正确路由到后端服务。最后,解决了服务解析时可能出现的问题,确保服务的IP地址而非节点名称被正确解析。
605 0
Ocelot集成Consul实现api网关与服务发现
|
移动开发 Unix Linux
拉取代码编辑器中报错`Delete ␍ prettier/prettier` 问题的解决方案
通过正确配置Prettier、EditorConfig文件和编辑器设置,可以有效解决 `Delete ␍ prettier/prettier`的问题。这不仅能避免频繁的格式化错误,还能确保团队成员在不同开发环境下的代码风格一致,提升项目的代码质量和可维护性。按照上述解决方案调整配置后,您的项目将更加规范,代码也会更具一致性。
1928 4
|
SQL 关系型数据库 数据库连接
Entity Framework Core 入门教程来袭!快速上手强大的 ORM 工具,开启高效数据库开发之旅!
【8月更文挑战第31天】Entity Framework Core(EF Core)是一个轻量且可扩展的对象关系映射(ORM)框架,允许开发者使用 .NET 语言操作数据库而无需直接编写 SQL 语句。本教程涵盖 EF Core 的安装、数据库上下文创建、数据库连接配置及常见数据库操作(如添加、查询、更新和删除),并介绍如何利用数据库迁移功能安全地更改数据库结构。通过本教程,你可以快速掌握 EF Core 的基本用法,提高开发效率。
2415 0
|
Ubuntu 持续交付 API
如何使用 dotnet pack 打包 .NET 跨平台程序集?
`dotnet pack` 是 .NET Core 的 NuGet 包打包工具,用于将代码打包成 NuGet 包。通过命令 `dotnet pack` 可生成 `.nupkg` 文件。使用 `--include-symbols` 和 `--include-source` 选项可分别创建包含调试符号和源文件的包。默认情况下,`dotnet pack` 会先构建项目,可通过 `--no-build` 跳过构建。此外,还可以使用 `--output` 指定输出目录、`-c` 设置配置等。示例展示了创建类库项目并打包的过程。更多详情及命令选项,请参考官方文档。
1217 12
|
关系型数据库 Java MySQL
C#winform中使用SQLite数据库
C#winform中使用SQLite数据库
1131 3
C#winform中使用SQLite数据库