打算把之前開源的 基于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
檔案的,然後加上日志處理。等寫完日志處理的時候再補充。