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

news2024/11/26 7:39:48

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的目录下。
在这里插入图片描述
代码

/// <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 使用增删改查

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 如何使用 Web 容器

Spring Boot 如何使用 Web 容器 在使用 Spring Boot 进行开发时&#xff0c;我们通常需要使用 Web 容器来处理 HTTP 请求和响应。本文将介绍 Spring Boot 如何使用 Web 容器&#xff0c;包括如何配置 Web 容器、如何处理 HTTP 请求和响应等内容&#xff0c;并提供相应的代码示…

堡垒机免费版在哪里下载?是否安全可靠?

2023年整体大环境都不容乐观&#xff0c;很多企业预算有限。但安全运维又至关重要&#xff0c;因此很多企业都在寻找堡垒机免费版&#xff0c;都在问堡垒机免费版在哪里下载&#xff1f;是否安全可靠&#xff1f;这里我们小编就来简单解答一下。 堡垒机免费版在哪里下载&#…

聚焦行业云方案共性,Gartner 给出最新建议:建设行业云平台

出品 | CSDN 云计算 对绝大部分 IT 从业者来说&#xff0c;云计算是从 2005 年开始以 IaaS 进入他们眼中&#xff0c;同时&#xff0c;云计算的相关技术演化从基础设施、技术平台、数据/分析、人工智能机器学习等多个领域都产生了颠覆性的技术变革。不过&#xff0c;在云化之后…

如何监测Android网络类型:5G/4G/3G/2G能力

如何监测Android网络类型&#xff1a;5G/4G/3G/2G能力 App可以通过了解所连接的网络类型来获益&#xff0c;例如启用某些功能需要5G提供的带宽和低延迟。如果只有2G或3G网络可用&#xff0c;加载时间会比较慢&#xff0c;因此我们可以对加载时间有一定的预期。 在这里&#xf…

Chatterbot 打造游戏AI客服机器人

准备工具 1、开发语言&#xff1a;Python3 2、数据库&#xff1a;MongoDB 3、开源框架&#xff1a;Chatterbot 4、依赖类库&#xff1a; pip3 install chatterbotpip3 install spacy# 需要手动编译安装 en_core_web_sm(使用2.1版本)pip3 install jiebapip3 install colo…

Web网页制作期末复习(3)——HTML5新增标签、CSS简介、CSS的引入方式、选择器、字体属性、背景属性、表格属性、关系选择器

目录 HTML5新增标签 CSS简介 CSS概念 CSS的作用 语法 CSS的引入方式 内联样式&#xff08;行内样式&#xff09; 内部样式 外部样式&#xff08;推荐&#xff09; 选择器 全局选择器 元素选择器 类选择器 ID选择器 合并选择器 选择器的优先级 字体属性 …

python多线程----------主线程,子线程,任务讲解----拿下就是胜利

这一篇博客主要介绍给分不清楚主线程.子线程的小可爱们 在之前的一篇博客中我简单的介绍了并发,并行 并发:是在时段的完成多个任务 ,但是每个时间点只有一个任务运行 而多线程就是这一个原理 非守护线程 代码: from threading import Thread import requests from seleni…

规则引擎调研及初步使用 | 京东云技术团队

一、产生的背景 生产过程中&#xff0c;线上的业务规则内嵌在系统的各处代码中&#xff0c;每次策略的调整都需要更新线上系统&#xff0c;进行从需求->设计->编码->测试->上线这种长周期的流程&#xff0c;满足不了业务规则的快速变化以及低成本的更新试错迭代。…

亚马逊关于儿童餐椅/增高椅/折叠椅和非折叠椅/凳政策

检测认证很迷茫&#xff1f;关注老李直通关&#xff01;大家好我是李老师。近期碰到很多卖家在吐槽儿童椅子类型的检测&#xff0c;甚至某些卖家要做2-3个标准&#xff0c;确实有点夸张&#xff0c;下面是我为大家整理的关于各类儿童椅子认证的标准&#xff0c;希望可以帮到大家…

游泳戴的耳机推荐,列举感受水下快乐的游泳耳机

​游泳是个真心好玩的活动&#xff0c;对一般人来说简直是大杀器&#xff01;它不仅对身体没有太大伤害&#xff0c;还能锻炼到身体的大部分肌肉&#xff0c;对心肺也超级有帮助。不过&#xff0c;问题来了&#xff1a; 之前很少见到有人戴耳机游泳&#xff0c;主要是担心进水…

论文笔记:Toolformer:可以教会自己使用工具的语言模型

Toolformer&#xff1a;可以教会自己使用工具的语言模型 摘要Introduction现有大模型的局限处理办法本文的idea Approach样例化API调用执行API调用筛选API调用模型微调 实验局限 论文地址点这里 摘要 语言模型&#xff08;LMs&#xff09;呈现了令人深刻的仅使用少量的范例或…

Spring Boot 容器的生命周期

Spring Boot 容器的生命周期 在使用 Spring Boot 进行开发时&#xff0c;我们经常需要对 Spring 容器的生命周期进行了解和掌握。本文将介绍 Spring Boot 容器的生命周期&#xff0c;包括容器的创建、初始化、销毁等过程&#xff0c;并提供相应的代码示例。 Spring Boot 容器的…

C++基础(3)——类和对象(1)

前言 本文主要介绍了C中类和对象的基本知识 4.1.1&#xff1a;封装 写一个Circle类&#xff0c;然后分别在栈上和堆上创建两个圆对象&#xff0c;对象包含属性和行为&#xff0c;调用求周长的成员函数&#xff0c;并打印出结果。 4.1.2&#xff1a;封装-访问权限 public成员…

Server - 配置安装 Git LFS | BWM-NG | Tmux | BOS 等命令

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131302104 构建实验Docker&#xff1a; nvidia-docker run -it --name git-lfs-[your name] --nethost -p [port]:[port] -v [nfs path…

基于spring cloud技术栈构建的一款源码级jvs低代码平台,值得收藏

开发团队在日常的项目开发过程中 &#xff0c;会遇到各种各样单点需求。 确保应用程序能够满足特定的业务需求并与现有系统和服务进行有效集成&#xff0c;那么是团队选择对应技术栈或者整体开发工具的核心考量&#xff1a; 核心关注的点&#xff1a; 1、技术栈的选择&#…

vue3-实战-11-管理后台-权限管理之角色管理模块

目录 1-角色列表 1.1-原型需求分析 1.2-接口封装和数据类型定义 1.3-请求服务器端获取列表页面数据 1.4-组件页面动态渲染数据 2-角色新增和编辑 2.1-需求原型分析 2.2-页面结构以及功能实现 3-角色的删除 4-分配权限 4.1-原型需求分析 4.2-获取服务器数据渲染数据…

五、Producer源码解读

Producer源码解读 在 Kafka 中, 我们把产生消息的一方称为 Producer 即 生产者, 它是 Kafka 的核心组件之一, 也是消息的来源所在。它的主要功能是将客户端的请求打包封装发送到 kafka 集群的某个 Topic 的某个分区上。那么这些生产者产生的消息是怎么传到 Kafka 服务端的呢&a…

二维码带参数跳转小程序页面,小程序获取参数。

功能介绍 普通链接二维码&#xff0c;是指开发者使用工具对网页链接进行编码后生成的二维码。 线下商户可不需更换线下二维码&#xff0c;在小程序后台完成配置后&#xff0c;即可在用户扫描普通链接二维码时打开小程序&#xff0c;使用小程序的功能。 对于普通链接二维码&a…

5.4.2 网络地址转换NAT

5.4.2 网络地址转换NAT 我们知道为了缓解IPv4地址紧缺的问题&#xff0c;相继出现了一系列缓解地址耗尽的解决方案&#xff0c;比如通过子网划分&#xff08;5.2.8 子网编址&#xff09;实现网络地址在多个物理网络之间的复用&#xff0c;通过无分类编址&#xff08;5.2.9 无分…

纳斯达克大屏宣传品牌的价值何在?媒介易解析背后的优势!

在当今竞争激烈的商业环境中&#xff0c;企业需要不断寻找创新的方式来宣传和推广品牌。而纳斯达克大屏作为全球最具规模和影响力的数字广告媒体之一&#xff0c;其庞大的电子屏幕成为企业宣传品牌和增加曝光度的理想平台。为什么企业选择在纳斯达克大屏宣传品牌&#xff1f;一…