ASP.NET Core Web API入门之三:使用EF Core

ASP.NET Core Web API入门之三:使用EF Core

  • 一、引言
  • 二、EF Core 的优缺点
    • 2.1 优点:
    • 2.2 缺点:
  • 三、使用前安装:NuGet包
  • 四、实体类更新到数据库实体表
    • 4.1 创建 DBEntity 属性
    • 4.2 appsettings.json 配置数据库连接串
    • 4.3 修改 DemoContext 的 OnModelCreating方法、OnConfiguring方法
    • 4.4 创建实体类
    • 4.5 更新数据库实体表
  • 五、EF Core 使用增删改查
  • 六、结果

一、引言

一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。

二、EF Core 的优缺点

2.1 优点:

1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。
2、提升了开发效率,不需要在编写Sql脚本,但是有些特殊Sql脚本EF无法实现,需要我们自己编写(通过EF中的ExecuteSqlCommand实现插入、修改、删除、SqlQuery执行查询)。
3、EF提供的模型设计器十分强大,可以让我们清晰的指定或者查看表与表之间的关系(一对多,多对多…)。
4、EF提供的导航属性十分好用。
5、EF的延迟查询加载机制,数据在用到的时候才会去数据库查询。

2.2 缺点:

1、性能差(生成Sql脚本阶段),在复杂查询的时候生成的脚本不是很高。
2、第一次执行时会有预热,预热时性能较差,不过将映射关系加载到内存之后就会好很多。
3、对于大批量的数据操作效率比较慢。

三、使用前安装:NuGet包

  1. Microsoft.EntityFrameworkCore:提供了数据上下文和DbSet属性,我们在程序里面就是通过数据上下文和DbSet属性来对数据库里面的数据进行操作。
  2. Micorsoft.EntityFrameworkCore.SqlServer:针对SqlServer数据库的扩展,使用SqlServer数据库必须。类似的还有MySql,SqlLite等。
  3. Micorsoft.EntityFrameworkCore.Tools:执行更新脚本。

四、实体类更新到数据库实体表

4.1 创建 DBEntity 属性

作用:因为我希望是动态将实体类与数据库实体表关联关系建立起来,所以我使用属性特性的方式来实现,只更新同步有此特性的实体类到数据库实体表。
文件目录:放置在Models/Attribute的目录下。
ASP.NET Core Web API入门之三:使用EF Core_第1张图片
代码

/// 
    /// 数据库实体特性
    /// 
    public class DBEntityAttribute: Attribute
    {

    }

4.2 appsettings.json 配置数据库连接串

"ConnectionStrings": {
    "DemoContext": "Server=127.0.0.1,1433;DataBase=WebApiDemo;User ID=sa;Password=sa;TrustServerCertificate=true;Trust Server Certificate=true;"
  }

4.3 修改 DemoContext 的 OnModelCreating方法、OnConfiguring方法

/// 
        /// 创建实体
        /// 
        /// 
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            #region 动态加入DbSet属性

            var assembly = Assembly.GetExecutingAssembly();
            foreach (Type type in assembly.ExportedTypes)
            {
                if (type.IsClass && type.GetCustomAttribute<DBEntityAttribute>() != null)
                {
                    var method = modelBuilder.GetType().GetMethods().Where(x => x.Name == "Entity").FirstOrDefault();   //得到当前对象的实体

                    if (method != null)
                    {
                        //加入DbSet属性
                        method = method.MakeGenericMethod(new Type[] { type });
                        method.Invoke(modelBuilder, null);
                    }
                }
            }

            #endregion

            base.OnModelCreating(modelBuilder);
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //base.OnConfiguring(optionsBuilder);

            //获取配置文件对象
            IConfiguration configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            //注入使用DemoContext连接串
            optionsBuilder.UseSqlServer(configuration.GetConnectionString("DemoContext"));
        }

4.4 创建实体类

基础类

using System.ComponentModel.DataAnnotations;

namespace ASP.NETCoreApi.Models
{
    public class EntityBase
    {
        /// 
        /// 主键
        /// 
        [Key]
        public int FID { get; set; }
    }
}

注:加入 Key 特性,则会在数据库中自动设置为自增长主键。
实体类主表

using System.ComponentModel.DataAnnotations.Schema;

namespace ASP.NETCoreApi.Models
{
    [DBEntity]
    [Table("T_WDQ_DemoTable")]
    public class DemoTable:EntityBase
    {
        /// 
        /// 姓名
        /// 
        public string FName { get; set; }

        /// 
        /// 编码
        /// 
        public string FNumber { get; set; }

        /// 
        /// 备注
        /// 
        public string FRemark { get; set; }
    }
}

实体类子表

using System.ComponentModel.DataAnnotations.Schema;

namespace ASP.NETCoreApi.Models
{
    [DBEntity]
    [Table("T_WDQ_DemoTableEntry")]
    public class DemoTableEntry: EntryEntityBase
    {
        public DemoTable DemoTable { get; set; }

        /// 
        /// 行号
        /// 
        public int FSeq { get; set; }

        /// 
        /// 数量
        /// 
        public decimal FQty { get; set; }

        /// 
        /// 单价
        /// 
        public decimal FPrice { get; set; }

        /// 
        /// 金额
        /// 
        public decimal FAmount { get; set; }
    }
}

4.5 更新数据库实体表

需要在程序包管理器控制台里执行同步更新的命令脚本,打开方式:
ASP.NET Core Web API入门之三:使用EF Core_第2张图片
在执行命令前,我们先要了解一下命令的使用,要做到知其然,知其所以然。

  • 命令:
    Add-Migration [operateName]:添加迁移,每次迁移前必须先执行该命令。
    [operateName]:操作名,例如:初始化时使用 Initial 命令,新增字段时使用 AddField 命令。
    Update-Database:更新数据库,更新新实体表/字段时执行。
    script-migration:执行该命令后,会根据最新的迁移文件生成SQL脚本(删除/修改字段),主要是用于生成SQL脚本后校验要删除/修改的字段是否正确,校验通过后再到生产环境中执行该SQL脚本。

:每次只能执行一个命令,不允许多个命令同时执行。

初始化:

Add-Migration Initial

在这里插入图片描述
更新数据库:

Update-Database

ASP.NET Core Web API入门之三:使用EF Core_第3张图片

五、EF Core 使用增删改查

具体的使用自行百度吧,这里就不再做阐述了。

六、结果

ASP.NET Core Web API入门之三:使用EF Core_第4张图片

结语:其实我是想使用动态更新实体对象与数据库实体表字段的,但是找了很久没有解决办法,就逼不得已先手敲命令行的方式来进行更新吧。

你可能感兴趣的:(ASP.NET,Core,Web,API,入门,asp.net,数据库)