翼度科技»论坛 编程开发 .net 查看内容

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

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9

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
    1. public class Article
    2. {
    3.         /// <summary>
    4.         /// 主键
    5.         /// </summary>
    6.         public long Id { get; set; }
    7.         /// <summary>
    8.         /// 标题
    9.         /// </summary>
    10.         public string Title { get; set; }
    11.         /// <summary>
    12.         /// 内容
    13.         /// </summary>
    14.         public string Content { get; set; }
    15.         /// <summary>
    16.         /// 此文章的若干条评论
    17.         /// </summary>
    18.         public List<Comment> Comments { get; set; } = new List<Comment>();
    19. }
    20. public class Comment
    21. {
    22.         public long Id { get; set; }
    23.         public Article Article { get; set; }
    24.         public long ArticleId { get; set; }
    25.         public string Message { get; set; }
    26. }
    复制代码
  • 创建实现了IEntityTypeConfiguration接口的实体类的配置类,用于配置实体类和数据库表的对应关系
    1. using Microsoft.EntityFrameworkCore;
    2. using Microsoft.EntityFrameworkCore.Metadata.Builders;
    3. // IEntityTypeConfiguration的泛型参数类指定这个类要对实体类 Article 进行配置
    4. class ArticleConfig : IEntityTypeConfiguration<Article>
    5. {
    6.         // 使用Fluent API的方式对实体类进行配置
    7.         // 也可以在实体类中使用 Data Annotation 进行配置,但那样耦合太深,不推荐使用
    8.         public void Configure(EntityTypeBuilder<Article> builder)
    9.         {
    10.                
    11.                 // 表示这个实体类对应数据库中名字为T_Articles的表
    12.                 builder.ToTable("T_Articles");
    13.                 builder.Property(p => p.Content).IsRequired().IsUnicode();
    14.                 builder.Property(p => p.Title).IsRequired().IsUnicode()
    15.                         .HasMaxLength(255);
    16.         }
    17. }
    18. class CommentConfig : IEntityTypeConfiguration<Comment>
    19. {
    20.         public void Configure(EntityTypeBuilder<Comment> builder)
    21.         {
    22.                 builder.ToTable("T_Comments");
    23.                 // 一条评论对应一篇文章,一篇文章有多条评论
    24.                 builder.HasOne<Article>(c =>c.Article)
    25.                         .WithMany(a => a.Comments)
    26.                         .IsRequired()
    27.                         .HasForeignKey(c => c.ArticleId);
    28.                 builder.Property(p=>p.Message).IsRequired().IsUnicode();
    29.         }
    30. }
    复制代码
  • 创建一个继承自DbContext类的TestDbContext类(上下文类)
    1. using Microsoft.EntityFrameworkCore;
    2. class TestDbContext: DbContext
    3. {
    4.         public DbSet<Article> Articles { get; set; }
    5.         public DbSet<Comment> Comments { get; set; }
    6.         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    7.         {
    8.                 string connStr = "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true";
    9.                 optionsBuilder.UseSqlServer(connStr);
    10.         }
    11.         protected override void OnModelCreating(ModelBuilder modelBuilder)
    12.         {
    13.                 base.OnModelCreating(modelBuilder);
    14.                 // 表示加载当前程序集中所有实现了IEntityTypeConfiguration接口的类
    15.                 modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
    16.         }
    17. }       
    复制代码
  • 迁移(根据实体类生成数据库表)

    • 打开 菜单 - 工具 - 程序包管理器控制台
    • 默认项目下拉框选择目标项目【可选,如果解决方案有多个项目】
    • 执行如下命令:
      Add-Migration InitialCreate 【InitialCreate 名字可随意取,有意义就好】
      说明:Add-Migration命令会自动在项目的Migrations文件夹中生成C#代码

    • 执行命令
      Update-database
      说明:编译并且执行数据库迁移代码

    • 查看 sql server 数据库是否执行成功
    • 如果添加或修改字段,重复执行3~4步命令

  • 至此,EF Core 的 Code First 过程已经完成,接着就可以对数据进行增删改查等操作
扩展 - Fluent API 基本语法例子


  • 视图与实体类映射
    1. modelBuilder.Entity<Blog>().ToView("blogsView");
    复制代码
  • 排除属性映射
    1. modelBuilder.Entity<Blog>().Ignore(b => b. Name2);
    复制代码
  • 数据库表列名
    1. modelBuilder.Entity<Blog>().Property(b =>b.BlogId).HasColumnName("blog_id");
    复制代码
  • 列数据类型
    1. builder.Property(e => e.Title) .HasColumnType("varchar(200)")
    复制代码
  • 主键
    1. modelBuilder.Entity<Student>().HasKey(c => c.Number);
    复制代码
  • 索引
    1. modelBuilder.Entity<Blog>().HasIndex(b => b.Url);
    2. // 复合索引
    3. modelBuilder.Entity<Person>().HasIndex(p => new { p.FirstName, p.LastName });
    复制代码
  • 多对多
    1. builder.HasMany<Teacher>(c => c.Teachers).WithMany(t => t.Students)
    2.         .UsingEntity(j => j.ToTable("T_Students_Teachers"));
    复制代码
  • 1对多
    1. builder.HasOne<Article>(c =>c.Article)
    2.         .WithMany(a => a.Comments)
    3.         .IsRequired()
    4.         .HasForeignKey(c => c.ArticleId);
    复制代码
  • 1对1
    1. builder.HasOne<Delivery>(c => c.Delivery).WithOne(d => d.Order)
    2.         .HasForeignKey<Delivery>(d => d.OrderId);
    复制代码

来源:https://www.cnblogs.com/JackyGz/archive/2023/12/27/17931042.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具