1、簡介
EFcore,可用使得開發人員不需要再去關注資料庫的實現,全都由程式碼進行生成
這樣有利於減少工作量、資料庫快速遷移...
2、上手搭建架構
(這個圖是做完本章內容的完整圖,我們一步步深入即可)
在寫EF之前,先安裝好資料庫,我選擇在本地安裝Sqlserver
我們先執行最核心的兩步,將EF和資料庫跑通
1)類&表的定義:基本上會保持class和資料庫的table欄位保持一致,如上UserModel,我定義了Staff、Tenant兩個類,會自動生成兩個表
UserModel需要安裝
Microsoft.EntityFrameworkCore.SqlServer
Staff
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace UserModel { public class Staff { public int Id { get; set; }public string Name { get; set; } public string Description { get; set; } public string? PhoneNumber { get; set; } public string? Email { get; set; } } }
Tenant
namespace UserModel { public class Tenant { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } } }
2)上下文定義:負責關聯實體類、存取資料庫設定,提供後續生成資料庫支援,如上MyDBContextLibrary
MyDBContextLibrary需要安裝
Microsoft.EntityFrameworkCore.Tools
MyDBContext
using Microsoft.EntityFrameworkCore; namespace UserModel { public class MyDBContext : DbContext { public DbSet<Staff> Staffs { get; set; } public DbSet<Tenant> Tenants { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes"); } } }
準備完畢!!
開啟【程式包管理器控制檯】
專案指定到MyDBContext
Add-Migration Ini #新增一個遷移 Ini是為這個遷移起的備註名
Update-database #更新到資料庫,執行了才會同步遷移到資料庫
到此,簡單的EF框架已經跑起來了
3、擴充套件
EF是一個十分強大的框架,我們逐漸擴充套件知識點。
1)屬性定義
有兩種方式
其一:Data Annotations(資料註解),利用特性進行定義,如對Staff屬性進行定義
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; //Data Annotations例子 namespace UserModel { [Table("Staff")]//可用加特性指定表名 public class Staff { public int Id { get; set; } [Required]//必填 [MaxLength(10)]//最大長度為10 public string Name { get; set; } [Required] public string Description { get; set; } public string? PhoneNumber { get; set; } //可空 public string? Email { get; set; } } }
PS:提醒一點,Id / 類名+Id 在遷移到資料庫表的時候,會預設為遞增序列
其二:Fluent API,微軟官方提供的API,如對Tenant屬性進行定義
在MyDBContext,重寫OnModelCreating方法
using Microsoft.EntityFrameworkCore; namespace UserModel { public class MyDBContext : DbContext { public DbSet<Staff> Staffs { get; set; } public DbSet<Tenant> Tenants { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder);modelBuilder.Entity<Tenant>().Property(x=>x.Description).IsRequired(false); /*指定Description非必填*/ } } }
當然,我們容易看到,如果實體很多,屬性直接寫在這裡程式碼太冗長了
改變一下方法,新增一個TenantConfig類
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace UserModel { public class TenantConfig : IEntityTypeConfiguration<Tenant> { public void Configure(EntityTypeBuilder<Tenant> builder) { builder.ToTable("Tenant");//可重新指定表名 builder.HasKey(x => x.Id); builder.Property(x=>x.Name).IsRequired().HasColumnType("nvarchar(100)"); builder.Property(x=>x.Description).IsRequired(false); } } }
然後 DbContext:
using Microsoft.EntityFrameworkCore; namespace UserModel { public class MyDBContext : DbContext { public DbSet<Staff> Staffs { get; set; } public DbSet<Tenant> Tenants { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(typeof(Tenant).Assembly); //利用反射,載入Tenant程式集下的IEntityTypeConfiguration } } }
完成,再次生成一個遷移到資料庫看看!!!
程式碼不會一步到位的,大家逐步測試嚴重,這邊我就不貼資料庫的截圖了
4、最後說明一下ConsoleApp
Program
using UserModel; using(var ctx = new MyDBContext()) { var s = new Staff() { Name = "kxy2", Description = "三好員工", PhoneNumber = "1234567890" }; ctx.Staffs.Add(s); var t = new Tenant() { Name = "ccc", }; ctx.Tenants.Add(t); ctx.SaveChanges(); } Console.ReadLine();
測試資料而已,怎麼方便怎麼來
PS:有個點,如果設定ConsoleApp為啟動項,遷移的時候會驗證啟動項的依賴,從而產生錯誤
ConsoleApp需要安裝
Microsoft.EntityFrameworkCore.Design
至此,完成!!
感謝關注