ASP.Net Core5.0 EF Core使用記錄

果凍棟吖發表於2021-06-01

打算把之前開源的 基於ASP.Net Core開發一套通用後臺框架 重新用ASP.Net Core 5寫一遍,也算是鞏固一下舊知識,學習下新知識。本文是專案搭建初期關於 EF Core 的使用記錄

1、專案結構

LYAdmin專案結構.png

2、新增引用

LY.Admin.Model專案新增Microsoft.EntityFrameworkCore的NuGet引用,因為我們如果 實體屬性 需要使用資料批註方式而不是使用Fluent API的話是需要用到的。
LY.Admin.Repositories專案新增Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.DesignMicrosoft.EntityFrameworkCore.ToolsPomelo.EntityFrameworkCore.MySql的NuGet引用以及LY.Admin.Model的專案引用。
LY.Admin.Web專案新增Microsoft.EntityFrameworkCore.DesignPomelo.EntityFrameworkCore.MySql的NuGet引用以及LY.Admin.Repositories的專案引用。

3、建立Model

實體屬性有資料批註Fluent API兩種,我們這裡兩種混合使用,實際專案中只需要一種就可以了。

Entity

我們所有表基本都是有通用欄位的,那麼把這些通用欄位放到一個父類中更好處理。

   public class Entity
    {
        /// <summary>
        /// Id
        /// </summary>
        [Key]
        [Column("id")]
        [Comment("主鍵Id")]
        public int Id { get; set; }
        /// <summary>
        /// 刪除標識
        /// </summary>
        [Column("delete_flag")]
        [Comment("刪除標識")]
        public int DeleteFlag { get; set; }
        /// <summary>
        /// 建立人
        /// </summary>
        [Column("created_by")]
        [Comment("建立人")]
        public int CreatedBy { get; set; }
        /// <summary>
        /// 建立時間
        /// </summary>
        [Column("created_time")]
        [Comment("建立時間")]
        public DateTime CreatedTime { get; set; }
        /// <summary>
        /// 更新人
        /// </summary>
        [Column("update_by")]
        [Comment("更新人")]
        public int? UpdatedBy { get; set; }
        /// <summary>
        /// 更新時間
        /// </summary>
        [Column("update_time")]
        [Comment("更新時間")]
        public DateTime? UpdatedTime { get; set; }
    }

4、Post(演示表)

Author欄位我們使用Fluent API

[Table("tb_post")]
public class Post : Entity
{
    /// <summary>
    /// 標題
    /// </summary>
    [Column("title")]
    [Comment("標題")]
    public string Title { get; set; }
    /// <summary>
    /// 內容
    /// </summary>
    [Column("body")]
    [Comment("內容")]
    public string Body { get; set; }
    /// <summary>
    /// 作者 這裡使用 Fluent API 方式去控制 具體見 LY.Admin.Repositories.Database.EntityConfigurations.PostConfiguration
    /// </summary>
    public string Author { get; set; }
}

5、建立DbContext

如果使用Fluent API是需要在OnModelCreating進行設定的程式碼如下

DbContext

public class LYAdminDbContext:DbContext
{
    /// <summary>
    /// 建構函式 呼叫父類建構函式
    /// </summary>
    /// <param name="options"></param>
    public LYAdminDbContext(DbContextOptions<LYAdminDbContext> options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        
        #region 實體屬性 
        // 參考 https://docs.microsoft.com/zh-cn/ef/core/modeling/entity-properties
        // 可以使用 資料批註 或者 Fluent API
        modelBuilder.ApplyConfiguration(new PostConfiguration()); 

        #endregion
    }
    public DbSet<Post> Posts { get; set; }
}

PostConfiguration

這裡是每個實體類都單獨寫的,更多API檢視實體屬性

/// <summary>
/// 實體屬性
/// 參考 https://docs.microsoft.com/zh-cn/ef/core/modeling/entity-properties
/// 可以使用 資料批註 或者 Fluent API
/// </summary>
public class PostConfiguration : IEntityTypeConfiguration<Post>
{
    public void Configure(EntityTypeBuilder<Post> builder)
    {
        builder.Property(x => x.Author).HasMaxLength(50).HasColumnType("varchar(50)").HasColumnName("author").HasComment("作者");
    }
}

6、LY.Admin.Web

修改Startup

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<LYAdminDbContext>(options =>
    {
        var connectionString = this.Configuration["ConnectionStrings:MySqlConn"];
		//這裡現在需要指定版本,暫時設定為自動檢測
        options.UseMySql(connectionString,ServerVersion.AutoDetect(connectionString));
    });
}

appsettings.json配置連線字串

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MySqlConn": "Server=127.0.0.1;Port=3306;Database=lyadmin;Uid=root;Pwd=123456;charset=utf8;Allow User Variables=True"
  }
}

7、資料遷移

開啟工具->NuGet包管理器->程式包管理器控制檯,預設專案選擇LY.Admin.Repositories。輸入命令Add-Migration Init
不出意外可以看到上述專案下自動生成了Migrations資料夾和程式碼。
Migrations資料夾和程式碼.png
如果此時我們覺得又有新的修改,可以直接刪除當前遷移檔案Remove-Migration
修改完成後重新新增,然後執行Update-DataBase,就可以在資料庫中看到結果了。
表結構.png

注意:__EFMigrationsHistory是記錄我們遷移記錄的,所以Migrations資料夾和程式碼不可以手動刪除!

後續如果有新的修改,那我們直接Add-Migration XXX(說明),比如Add-Migration AddComment,然後同樣執行Update-DataBase就可以了。

筆記

如果想把所有的遷移檔案全都刪除,重新操作。應該怎麼做呢?
首先執行命令:Update-Database -Migration:0
然後執行命令:Remove-Migration,等所有的遷移檔案都刪除後,重新Add-Migration Update-DataBase就可以了。

初始化資料

因為我們使用Code Firsst的方式,是需要在程式一開始執行的時候初始化資料庫的,那麼,如何初始化?將在後續文章中說明,是需要修改Program.cs檔案的,然後加上日誌處理。等寫完日誌處理的時候再補充。

相關文章