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

  • 不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你已关闭评论
  • 51 次浏览
  • A+
所属分类:.NET技术
摘要

Code First 是 Entity Framework Core (简称 EF Core) 的一种开发模式,它允许开发人员使用纯粹的代码来定义数据模型,通过它,可以极大地提高开发效率:

不会使用 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#代码

    4. 执行命令

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

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