当前位置:   article > 正文

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

webapi efcore

一、引言

一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少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的目录下。
在这里插入图片描述
代码

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

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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;"
  }
  • 1
  • 2
  • 3

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

/// <summary>
        /// 创建实体
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            #region 动态加入DbSet<T>属性

            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<T>属性
                        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"));
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

4.4 创建实体类

基础类

using System.ComponentModel.DataAnnotations;

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

using System.ComponentModel.DataAnnotations.Schema;

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

        /// <summary>
        /// 编码
        /// </summary>
        public string FNumber { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string FRemark { get; set; }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

实体类子表

using System.ComponentModel.DataAnnotations.Schema;

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

        /// <summary>
        /// 行号
        /// </summary>
        public int FSeq { get; set; }

        /// <summary>
        /// 数量
        /// </summary>
        public decimal FQty { get; set; }

        /// <summary>
        /// 单价
        /// </summary>
        public decimal FPrice { get; set; }

        /// <summary>
        /// 金额
        /// </summary>
        public decimal FAmount { get; set; }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

4.5 更新数据库实体表

需要在程序包管理器控制台里执行同步更新的命令脚本,打开方式:
在这里插入图片描述
在执行命令前,我们先要了解一下命令的使用,要做到知其然,知其所以然。

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

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

初始化:

Add-Migration Initial
  • 1

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

Update-Database
  • 1

在这里插入图片描述

五、EF Core 使用增删改查

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

六、结果

在这里插入图片描述

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/666168
推荐阅读
相关标签
  

闽ICP备14008679号