前言: 繼上篇:Taurus .Net Core 微服務開源框架:Admin 插件【4-6】 - 配置管理-Mvc【Plugin-Doc 介面測試及文檔】 本篇繼續介紹下一個內容: 系統配置節點:Mvc - Plugin - Metric 介面調用次數統計: 配置界面如下: 1、Metric.IsE ...
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);