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