• ASP.Net Core5.0 EF Core使用记录


    打算把之前开源的 基于ASP.Net Core开发一套通用后台框架 重新用ASP.Net Core 5写一遍,也算是巩固一下旧知识,学习下新知识。本文是项目搭建初期关于 EF Core 的使用记录

    1、项目结构

    LYAdmin项目结构.png

    2、添加引用

    LY.Admin.Model项目添加Microsoft.EntityFrameworkCore的NuGet引用,因为我们如果 实体属性 需要使用数据批注方式而不是使用Fluent API的话是需要用到的。
    LY.Admin.Repositories项目添加Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.DesignMicrosoft.EntityFrameworkCore.ToolsPomelo.EntityFrameworkCore.MySql的NuGet引用以及LY.Admin.Model的项目引用。
    LY.Admin.Web项目添加Microsoft.EntityFrameworkCore.DesignPomelo.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文件夹和代码。
    Migrations文件夹和代码.png
    如果此时我们觉得又有新的修改,可以直接删除当前迁移文件Remove-Migration
    修改完成后重新添加,然后执行Update-DataBase,就可以在数据库中看到结果了。
    表结构.png

    注意:__EFMigrationsHistory是记录我们迁移记录的,所以Migrations文件夹和代码不可以手动删除!

    后续如果有新的修改,那我们直接Add-Migration XXX(说明),比如Add-Migration AddComment,然后同样执行Update-DataBase就可以了。

    笔记

    如果想把所有的迁移文件全都删除,重新操作。应该怎么做呢?
    首先执行命令:Update-Database -Migration:0
    然后执行命令:Remove-Migration,等所有的迁移文件都删除后,重新Add-Migration Update-DataBase就可以了。

    初始化数据

    因为我们使用Code Firsst的方式,是需要在程序一开始运行的时候初始化数据库的,那么,如何初始化?将在后续文章中说明,是需要修改Program.cs文件的,然后加上日志处理。等写完日志处理的时候再补充。

  • 相关阅读:
    PS教程1000例
    [LeetCode] Ransom Note 赎金条
    Android LinkedList和ArrayList的区别
    Android 一种非常好用的Android屏幕适配
    Android MVC模式和MVP模式的区别
    Android 性能优化的方面方面都在这儿
    Android 高级面试题及答案
    Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)
    android studio 3.0 以上 查看sharedpreference
    Android adb命令查看sharedpreferences
  • 原文地址:https://www.cnblogs.com/jellydong/p/14837397.html
Copyright © 2020-2023  润新知