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
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(演示表)
[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
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
/// <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
,就可以在数据库中看到结果了。
后续如果有新的修改,那我们直接Add-Migration XXX(说明)
,比如Add-Migration AddComment
,然后同样执行Update-DataBase
就可以了。
笔记
如果想把所有的迁移文件全都删除,重新操作。应该怎么做呢?
首先执行命令:Update-Database -Migration:0
然后执行命令:Remove-Migration
,等所有的迁移文件都删除后,重新Add-Migration
、Update-DataBase
就可以了。
初始化数据
因为我们使用Code Firsst
的方式,是需要在程序一开始运行的时候初始化数据库的,那么,如何初始化?将在后续文章中说明,是需要修改Program.cs
文件的,然后加上日志处理。等写完日志处理的时候再补充。