.Net开发——EFCore

news2025/1/15 13:35:57

1 EFCore是一个ORM框架

EFCore(EntityFramworkCore)是对底层ADO.NET重新封装的一个数据操作框架,因此ADO.NET支持的多种数据库都可以被EFCore支持。

EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:

  • 使 .NET 开发人员能够使用 .NET 对象处理数据库
  • 避免SQL的编写。
  • 开发更加高效

2 EFCore模型配置

EFCore的主要核心逻辑就是操作对象来处理数据库中的增删改查,因此.Net对象就需要对应着数据库中的实体表。因此要进行实体对象与数据库表的模型配置。
模型配置的方式有两种,基于特性与Fluent API


基于特性配置

    /// <summary>
    /// 使用Data_Annotation来进行模型映射
    /// Table特性,指明表名
    /// MaxLength,设定属性的最大长度,对应数据库即字段的最大长度
    /// Required,属性不为空,意即数据库中该字段不可为空
    /// </summary>
    [Table("T_CAT")]
    public class Cats
    {
        [Key]
        [MaxLength(30)]
        public string Id { get; set; }
        [MaxLength(30)]
        [Required]
        public string Name { get; set; }
    }

基于FluentAPI 配置
1 创建模型类

    public class LabelConfig
    {
        public string ROW_ID { get; set; }
        public string SYSTEM_NAME { get; set; }
        public string SYSTEM_GROUP { get; set; }
        public string LABEL_NAME { get; set; }
        public string LABEL_LAN { get; set; }
        public string LABEL_DESC { get; set; }
        public string CREATE_EMP { get; set; }
        public DateTime? CREATE_TIME { get; set; }
        public string AGE1 { get; set; }
        public string AGE2 { get; set; }
    }

2 创建映射配置类

    public class SignAgentConfig : IEntityTypeConfiguration<LabelConfig>
    {
        public void Configure(EntityTypeBuilder<LabelConfig> builder)
        {
            //TEntity与表C_SIGN_AGENT的映射关系
            //未具体设置字段间的映射关系时,默认对象的属性和表的字段一一对应
            builder.ToTable("REPLACE_LABEL_CONFIG");
            //设置字段 
            builder.Property(i => i.ROW_ID).HasMaxLength(30).IsRequired();
            //忽略Age2的映射
            builder.Ignore(i=>i.AGE2);
            //设置主键
            builder.HasKey(i=>i.ROW_ID);
            //设置列名映射
            builder.Property(i => i.AGE1).HasColumnType("VARCHAR2(20)").HasColumnName("AGE");
            //设置默认值
            builder.Property(i => i.SYSTEM_GROUP).HasDefaultValue("defaltGroup");
            //设置索引 IsUnique唯一索引
            builder.HasIndex(i=>i.LABEL_NAME).IsUnique().HasName("Index1");
            //设置复合索引
            //IndexBuilder HasIndex([NotNullAttribute] Expression<Func<TEntity, object>> indexExpression)
            //Expression<Func<TEntity, object>> indexExpression 
            builder.HasIndex(i => new
            {
                i.LABEL_NAME,
                i.LABEL_LAN
                //设置索引名称 HasName
            }).HasName("Index2");
        }
    }

4 DbContext配置

    /// <summary>
    /// DbContext 类比与整个数据库中session连接,可在单次连接中操作DbSet<T>来操作数据库,如查找,
    /// DbSet<TEntity> 类比与数据库中的单个表;当增加、移除表时,需要同时增加、移除DbSet<TEntity>属性
    /// </summary>
    public class MyDbContext:DbContext
    {
        public DbSet<LabelConfig> agents { get; set; }
        public DbSet<Cats> cats { get; set; }

        //配置数据库连接字符信息
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string connection_str = "连接字符串";
            //使用Oracle数据库
            optionsBuilder.UseOracle(connection_str);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //模型加载,加载当前Assembly程序集中继承了IEntityTypeConfiguration<T>的模型配置类
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        
        }
    }

3 数据迁移Migration

根据实体类定义的变化生成的脚本,通过迁移动作同步到真实数据库中,简而言之,就是实体类属性的增加、移除动作,可通过Migration同步到数据中,相应产生的就是数据库字段的增加与移除动作。
在使用Migration功能之前,必须先要安装相应的nuget包(自行选择合适版本)。
Install-Package Microsoft.EntityFrameworkCore.Tools -Version 2.2.1

指令1: Add-Migration 【名称】

根据类模型类配置定义生成迁移脚本,通常后加一个迁移名称,标识当前类定义生成的最新迁移脚本。使用该指令后迁移脚本会在Migrations 文件夹中自动生成
在这里插入图片描述
在这里插入图片描述
使用Add-Migration update指令后,在Migrations生成了执行编号_Name,执行编号_Name.Designer两个执行脚本。
使用迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做向上迁移(Up),也可以执行把数据库回退到旧的迁移,这个操作叫做向下迁移(Down)。除非有特殊需要,Migration文件下生成的迁移脚本不要轻易去删除。

指令2: Update-Databse

将类型定义变更到数据库中
在这里插入图片描述在这里插入图片描述

5 EFCore与Linq语法的使用

    class Program
    {
        /// <summary>
        /// 使用DbContext实现增删改查;使用对象操作代替数据库中SQL的操作
        /// </summary>
        /// <param name="args"></param>
        static  void Main(string[] args)
        {
            using (MyDbContext context = new MyDbContext()) {

                for (int i = 0; i < 10; i++)
                {
                    LabelConfig c = new LabelConfig();
                    c.ROW_ID = i.ToString();
                    c.SYSTEM_NAME = "test";
                    c.SYSTEM_GROUP = "test";
                    c.LABEL_NAME = "Label" + i;
                    c.LABEL_DESC = "Label" + i;
                    c.LABEL_LAN = "ef-core-lan" + i;
                    c.CREATE_TIME = DateTime.Now;
                    //插入数据库
                    context.agents.Add(c);
                }
                //异步操作 保存数据表的变更 等价于Update - Database,一定要执行该方法
                Task<int> res = context.SaveChangesAsync();
                int qty = res.Result;
                Console.OutputEncoding = Encoding.Unicode;
                Console.WriteLine($"成功插入{qty}条数据");


                //查询操作,可勇Linq语法,面向对象的操作来代替数据库的SQL操作
                //因为DbContext中DbSet<TEntity>对象是一个继承了IEnumerable<T>的类,可以使用Linq语法来查询符合条件的对象
                //ORM 查询出来的对象对应数据库中指定查询条件的行
                var labels = context.agents.Where(item => item.SYSTEM_GROUP.Equals("test"));
                foreach (LabelConfig label in labels) {
                    Console.WriteLine($"行标为{label.ROW_ID}的LabelName为{label.LABEL_NAME}");
                }


                //数据库update 操作 【update+delete操作】
                //在EFCore中,update动作需要先查询处需要update、delete的数据,再进行update、delete操作,微软官方是为了保证数据库中数据的一致性
                //这种变更操作,意味着批量删除、修改数据库中的数据时,效率低
                var label_0 = context.agents.Where(i => i.LABEL_NAME.Equals("Label0")).First();
                //属性的set操作,等价于 数据库中的update LABEL_LAN='zh-cn'
                label_0.LABEL_LAN = "zh-cn";
                label_0.CREATE_EMP = "F133222X";
                label_0.CREATE_TIME = DateTime.Now;
                res= context.SaveChangesAsync();
                Console.WriteLine($"成功修改了{res.Result}条数据");


                //刪除数据
                var label_1 = context.agents.First(item => item.ROW_ID == "1");
                context.agents.Remove(label_1);
                res= context.SaveChangesAsync();
                Console.WriteLine($"成功删除了{res.Result}条数据");

            }


            Console.ReadKey();
        }
    }

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

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

相关文章

Python医学数据分析入门,推荐你学习这本书

医学生学习Python的难点通常在于 没有系统的编程教育&#xff0c;很难短时间内使用编程语言描述问题及其解答过程相关教程、案例少&#xff0c;想要练习缺少素材 所以这里就给大家推荐一本比较新比较前沿的教医学生学习Python的书《Python医学数据分析入门》 这本书的切入点为…

代码随想录——分割回文串 II

题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;1 解释&#xff1a;只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子…

Oracle技术分享 创建外键报错ORA-00906

问题描述&#xff1a;给表创建外键报错ORA-00906&#xff0c;具体过程如下&#xff1a; 数据库&#xff1a;oracle 11.2.0.464位 scottORCL2022-10-18 19:10:40> selectindex_name,table_name,tablespace_name,status,last_analyzed from user_indexes; INDEX_NAME TABLE…

事务【mysql】

1、事务的概念 事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 在不同的环境中&#xff0c;都可以有事务。对应在数据库中&#xff0c;就是数据库事务。 把多个操作打包成一个整体&#xff0c;要么全部都执行完…

【#HDC2022】HarmonyOS体验官活动正式开启,赶快投稿赢限量奖品吧!

1. 【活动简介】 HDC 2022 于11月4日线上线下正式开启。历时一年&#xff0c;在无数开发者的共同努力下&#xff0c;我们汇聚了HarmonyOS生态的新成果、新体验、新开放能力&#xff0c;邀你参与到HarmonyOS的每一步成长和构建中。 本次HarmonyOS体验官活动&#xff0c;将以文章…

MySQL自连接和内连接和外连接_左外连接+右外连接

自连接&#xff1a;将一张表看作两张表 练习&#xff1a;查询员工id&#xff0c;员工姓名及其管理者的id和姓名select emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name from employees emp,employees mgr where emp.manager_id mgr.employee_id;内连接 只是把左…

多肽Caerulein (desulfated)、pGlu-QDYTGWMDF-NH2、20994-83-6

Caerulein, desulfated 是脱硫后的Caerulein。Caerulein 是一种十肽&#xff0c;与胃泌素和胆囊收缩素 (CCK) 具有相同的五个羧基末端氨基酸。 Caerulein, desulfated is the desulfurated form of Caerulein. Caerulein is a decapeptide having the same five carboxyl-termi…

DevOps Master课程总结:知否知否,应是DevOps肥ITIL瘦

1.ITIL定义及挑战 ITIL即IT基础架构库(Information Technology Infrastructure Library, ITIL&#xff0c;信息技术基础架构库)由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末制订&#xff0c;现由英国商务部OGC(Office of Government…

Vue3 - computed 计算属性(详细教程)

简介 相信大家在 Vue2 中已经领略到了其功能&#xff0c;不再过多赘述了。 计算属性处理一些复杂的运算非常合适&#xff0c;对于任何包含响应式数据的复杂逻辑的表达式&#xff0c;都建议使用计算属性来完成&#xff0c;而不是臃肿的在模板中直接书写。 回忆 Vue2 先来看个 …

UE4插件-读取png图片

一、简介 在UE4中有多种类型的插件&#xff0c;适用于不同的场景。既可以放到引擎中还可以放到项目中&#xff0c;放到引擎中的插件可以被所有项目使用&#xff0c;放到项目中的插件只能被当前项目使用。插件的类型可以在【Edit】->【Plugins】->【New Plugin】中查看 …

06 在MSYS2中编译树莓派裸机程序,并在QEMU中运行

作者将狼才鲸创建日期2022-11-14 Gitee源码和工程地址&#xff1a;才鲸嵌入式 / 开源安防摄像机&#xff08;嵌入式软件&#xff09; CSDN文章地址&#xff1a;项目介绍&#xff1a;开源安防摄像机&#xff08;嵌入式软件&#xff09; 4&#xff09;完整的环境安装步骤 写在前…

软件产品测试的准入准出标准有哪些?

软件产品的测试并不是测试人员简单的执行测试过程便可以交付的&#xff0c;而是有着一定的标准&#xff0c;什么条件可以开始测试&#xff0c;什么时候结束测试等等也就是测试的准入准出标准。 一、软件测试的准入标准 1、开发人员编码结束并且已在开发环境中完成单元测试&a…

OpUtils局域网唤醒:远程引导计算机

局域网唤醒 &#xff08;LAN&#xff09;&#xff0c;通常称为 LAN 唤醒&#xff0c;是一种计算机网络标准&#xff0c;有助于远程启动有线和无线网络。也称为远程唤醒、LAN 唤醒、无线 LAN 唤醒或简称 WOL&#xff0c;LAN 唤醒技术可帮助网络管理员优化能源使用&#xff0c;并…

一文教你搞定Python如何自定义标准排序

文章目录1.字典自定义排序按照value排序按照key值排序先按照value降序&#xff0c;再按key升序2.多维列表自定义标准排序案例题目描述输入输出代码&#xff1a;1.字典自定义排序 按照value排序 sdict() s[a]45 s[b]44 s[c]78 s[d]34 asorted(s.items(),keylambda x:x[1],reve…

手摸手教你使用 Docker 快速搭建 Gitlab 服务

前言 Glitlab 比较占用内存&#xff0c;官方建议最低配置为 2核4G。我的服务器刚刚好是2核4G&#xff0c;但是还装了 Docker 跑一些其他服务&#xff0c;所以以防万一&#xff0c;还是选择在本地的虚拟机中进行安装。 如果你有一台配置较高的服务器那就更好了&#xff0c;一步…

nodejs+vue+elementui图书馆销售网上书城管理系统express228

目 录 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 摘 要 I ABSTRACT I 目 录 III 第1章 绪论 1 1.1开发背景 1 1.2开发意义 1 1.3研究内容 1 第2章 主要技术和工具介绍 3 下面我们讲解 1、 node_modules文…

【数据结构】队列详解 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列

文章目录前言队列的概念队列的结构队列的实现结构设计接口总览初始化销毁入队列出队列取对头数据取队尾数据判空计算队列大小OJ题用队列实现栈用栈实现队列设计循环队列结语前言 今天的内容分为两大块&#xff1a;队列讲解 和 OJ题。队列讲解部分内容为&#xff1a;队列概念&a…

Android App开发图像加工中卡片视图CardView和给图像添加装饰的讲解以及实战(附源码 简单易懂)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、卡片视图 随着手机越来越先进&#xff0c;开发者已经不满足简单地显示一张张图片&#xff0c;而要设计更多的花样&#xff0c;比如Android提供了一个卡片视图CardView&#xff0c;顾名思义它拥有卡片式的圆角边框&#xff…

[附源码]java毕业设计健身房管理系统论文2022

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

深度剖析 Vue3 如何通过虚拟DOM更新页面

上一讲我们主要介绍了 Vue 项目的首次渲染流程&#xff0c;在 mountComponent 中注册了effect 函数&#xff0c;这样&#xff0c;在组件数据有更新的时候&#xff0c;就会通知到组件的 update 方法进行更新 Vue 中组件更新的方式也是使用了响应式 虚拟 DOM 的方式&#xff0c…