打算把之前开源的 基于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
文件的,然后加上日志处理。等写完日志处理的时候再补充。