天天看點

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

打算把之前開源的 基于ASP.Net Core開發一套通用背景架構 重新用ASP.Net Core 5寫一遍,也算是鞏固一下舊知識,學習下新知識。本文是項目搭建初期關于 EF Core 的使用記錄

1、項目結構

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

2、添加引用

LY.Admin.Model

項目添加

Microsoft.EntityFrameworkCore

的NuGet引用,因為我們如果 實體屬性 需要使用

資料批注

方式而不是使用

Fluent API

的話是需要用到的。

LY.Admin.Repositories

項目添加

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Tools

Pomelo.EntityFrameworkCore.MySql

的NuGet引用以及

LY.Admin.Model

的項目引用。

LY.Admin.Web

項目添加

Microsoft.EntityFrameworkCore.Design

Pomelo.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

檔案夾和代碼。

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

如果此時我們覺得又有新的修改,可以直接删除目前遷移檔案

Remove-Migration

修改完成後重新添加,然後執行

Update-DataBase

,就可以在資料庫中看到結果了。

ASP.Net Core5.0 EF Core使用記錄
注意:__EFMigrationsHistory是記錄我們遷移記錄的,是以Migrations檔案夾和代碼不可以手動删除!

後續如果有新的修改,那我們直接

Add-Migration XXX(說明)

,比如

Add-Migration AddComment

,然後同樣執行

Update-DataBase

就可以了。

筆記

如果想把所有的遷移檔案全都删除,重新操作。應該怎麼做呢?

首先執行指令:

Update-Database -Migration:0

然後執行指令:

Remove-Migration

,等所有的遷移檔案都删除後,重新

Add-Migration

Update-DataBase

就可以了。

初始化資料

因為我們使用

Code Firsst

的方式,是需要在程式一開始運作的時候初始化資料庫的,那麼,如何初始化?将在後續文章中說明,是需要修改

Program.cs

檔案的,然後加上日志處理。等寫完日志處理的時候再補充。