Net6 EFcore框架介紹

2023-03-05 06:02:57

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

  至此,完成!!

  感謝關注