打算把之前開源的 基於ASP.Net Core開發一套通用後臺框架 重新用ASP.Net Core 5寫一遍,也算是鞏固一下舊知識,學習下新知識。本文是專案搭建初期關於 EF Core 的使用記錄
1、專案結構
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
資料夾和程式碼。
如果此時我們覺得又有新的修改,可以直接刪除當前遷移檔案Remove-Migration
。
修改完成後重新新增,然後執行Update-DataBase
,就可以在資料庫中看到結果了。
注意:__EFMigrationsHistory是記錄我們遷移記錄的,所以Migrations資料夾和程式碼不可以手動刪除!
後續如果有新的修改,那我們直接Add-Migration XXX(說明)
,比如Add-Migration AddComment
,然後同樣執行Update-DataBase
就可以了。
筆記
如果想把所有的遷移檔案全都刪除,重新操作。應該怎麼做呢?
首先執行命令:Update-Database -Migration:0
然後執行命令:Remove-Migration
,等所有的遷移檔案都刪除後,重新Add-Migration
、Update-DataBase
就可以了。
初始化資料
因為我們使用Code Firsst
的方式,是需要在程式一開始執行的時候初始化資料庫的,那麼,如何初始化?將在後續文章中說明,是需要修改Program.cs
檔案的,然後加上日誌處理。等寫完日誌處理的時候再補充。