ASP.NET Core Web API入门之三:使用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的目录下。
在这里插入图片描述
代码

/// <summary>
    /// 数据库实体特性
    /// </summary>
    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方法

/// <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"));
        }

4.4 创建实体类

基础类

using System.ComponentModel.DataAnnotations;

namespace ASP.NETCoreApi.Models
{
    public class EntityBase
    {
        /// <summary>
        /// 主键
        /// </summary>
        [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
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string FName { get; set; }

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

        /// <summary>
        /// 备注
        /// </summary>
        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; }

        /// <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; }
    }
}

4.5 更新数据库实体表

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

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

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

初始化:

Add-Migration Initial

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

Update-Database

在这里插入图片描述

五、EF Core 使用增删改查

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

六、结果

在这里插入图片描述

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值