.net项目开发-EF框架解决添加默认值问题

news2024/10/6 10:30:09

文章目录

  • 前言
  • EF中核心类DbContext
  • DbContext中的SaveChanges()方法
    • 重写SaveChanges()方法
      • 注意点-Modified
    • 其它状态下的实体如何操作

前言

最近开发.net项目,持久层用的是EF框架,也是第一次使用这个框架,用这个框架的好处就是基于实体的开发,就是当代码中实体创建完成可以使用EF提供的code frist模式去创建数据表,也解决了项目部署是写脚本创建数据库的问题。使用这个框架也出现了一个问题就是实体和表中的字段是映射的,如果你用一个实体去更新数据时字段中有null值你的数据表中的对应的数据也会被赋值null,这里主要是体现在创建、更新时间这两个字段。

EF中核心类DbContext

Entity Framework (EF) 框架中的 DbContext 是一个重要的类,它是与数据库交互的主要入口点。
DbContext 表示一个数据库会话,它包含了连接数据库的信息,以及用于查询、插入、更新和删除数据的方法。它充当了数据访问层和对象关系映射 (ORM) 之间的桥梁,使得开发者能够以面向对象的方式操作数据库。
以下是一些常见的 DbContext 的用法和属性:

  1. 连接数据库:通过在 DbContext 的构造函数中指定连接字符串来连接到数据库。
  2. 定义实体集合:通过在 DbContext 中声明属性来表示数据库中的实体表,每个属性对应一个实体类型。
  3. 查询数据:使用 DbContext 提供的 Set<T>() 方法来获取对应实体类型的查询接口,然后可以使用 LINQ 查询、延迟加载等方式来查询数据。
  4. 插入、更新和删除数据:使用 DbContext 提供的 Add(), Update(), Remove() 等方法来执行对实体的插入、更新和删除操作。
  5. 事务管理:DbContext 支持事务操作,你可以使用 DbContextDatabase.BeginTransaction() 方法来启动事务,并使用 SaveChanges() 方法来提交或回滚事务。
  6. 跟踪实体状态:DbContext 会自动跟踪实体对象的状态,以便在调用 SaveChanges() 方法时自动更新数据库。你可以使用 DbContextEntry() 方法来访问实体的状态信息,并手动更改状态或属性的值。
  7. 数据库初始化:你可以通过重写 DbContextOnModelCreating() 方法来配置数据库模型和初始化数据,或者使用 Code First Migrations 来管理数据库迁移。
    DbContext 是一个抽象类,你需要创建一个派生类来实现自己的上下文类,通常命名为 YourDbContext。这个派生类应该包含你的实体类作为属性,以便能够操作对应的数据库表。
    请注意,DbContext 是一个轻量级对象,通常在使用后即可释放,以避免资源浪费。可以使用 using 语句来确保 DbContext 在不再需要时被正确地释放。

DbContext中的SaveChanges()方法

上面简单了解了这个核心类的功能,那么在项目中实际应用就是写一个继承了DBContext类的一个数据库会话类
在这里插入图片描述
关于这个类的实体项目的配置这里暂时不做说明,大家可以查询一下这个相关的配置有很多,就不在这里说了,直奔主题

重写SaveChanges()方法

为什么重写SaveChanges()方法呢?
重写 SaveChanges() 方法是为了在数据保存到数据库之前,对数据进行一些额外的处理或添加一些自定义的逻辑。

你想要在插入数据时为多个实体的逻辑删除字段添加默认值。而 SaveChanges() 方法是在数据保存到数据库之前被调用的。

通过重写 SaveChanges() 方法,你可以拦截保存操作,检查处于 EntityState.Added 状态的实体,并为它们的逻辑删除字段添加默认值。

这种方式使你能够在插入数据时对逻辑删除字段进行一致的处理,而无需在每个插入操作之前手动设置默认值。

重写 SaveChanges() 方法是 Entity Framework 提供的一种扩展机制,允许你在保存数据之前和之后执行自定义逻辑。你可以在重写方法中添加其他处理逻辑,如验证、日志记录、修改跟踪状态等。这样可以根据具体需求来扩展和定制 EF 的默认行为。

在这里插入图片描述

        /// <summary>
        /// 在执行提交时去将实体中需要插入的数据添加默认值
        /// </summary>
        private void insertDefault()
        {
            //获取实体中属于添加状态的实体
            var addedEntities = ChangeTracker.Entries()
                .Where(e => e.State == EntityState.Added);

            foreach (var entityEntry in addedEntities)
            {
                //将实体中的
                entityEntry.Property("is_delete").CurrentValue = false;
                //判断实体是否创建时间属性,如果有则在插入时赋初值
                var createTime = entityEntry.Entity.GetType().GetProperty("create_time");
                if (createTime != null && createTime.CanWrite)
                {
                    entityEntry.Property("create_time").CurrentValue = DateTime.Now;
                }
                //以上代码是具有通用性的
            }
        }

这段代码重写了 Entity Framework 中的 SaveChanges() 方法,并添加了两个额外的方法 insertDefault()updateDefault()。主要目的是在执行提交操作之前,为实体中需要插入的数据添加默认值。

具体的作用如下:

  1. SaveChanges() 方法被重写,确保在保存数据之前执行自定义的逻辑。

  2. insertDefault() 方法用于添加默认值到需要插入的实体数据中。首先,通过 ChangeTracker.Entries() 方法获取处于 EntityState.Added 状态的实体集合。然后,遍历每个实体并进行以下处理:

    • 设置逻辑删除字段 is_delete 的值为 false,将其设为未被逻辑删除的状态。
    • 如果实体拥有 create_time 属性,将其设置为当前时间,以提供默认的创建时间值。
    • 对于 RegistryCodeEntity 实体,设置 is_overdue 字段的值为 0(byte 类型)。
  3. 最后,调用基类的 SaveChanges() 方法来执行实际的数据保存操作,并将保存的结果返回。

注意点-Modified

通常使用了EF框架查询到的实体的时候我们直接进行修改数据然后执行 SaveChanges()这方法,那么此时的这个实体状态就是Modified
在修改完实体后,如果没有显式设置实体的状态,而直接调用 SaveChanges() 方法,实体的状态将自动被识别为 Modified

当你修改实体的属性后,Entity Framework 会跟踪这些更改,并将实体的状态标记为 Modified。在调用 SaveChanges() 方法时,EF 将会保存这些更改到数据库中。

因此,如果你在修改完实体后不去显式设置实体的状态,而是直接调用 SaveChanges() 方法,实体的状态会被自动识别为 Modified,并将更改保存到数据库。

以下是一个示例:

var entity = dbContext.YourEntities.Find(entityId);
if (entity != null)
{
    entity.Property1 = newValue1;
    entity.Property2 = newValue2;
    // 修改其他属性

    dbContext.SaveChanges();
}

在上述示例中,我们修改了实体的多个属性,然后直接调用了 SaveChanges() 方法。由于我们没有显式设置实体的状态,EF 会自动将实体的状态标记为 Modified,并将更改保存到数据库。

这是 Entity Framework 的默认行为,只要实体的属性被修改,EF 会自动识别并将实体状态设置为 Modified。你不需要手动设置实体的状态,除非有特殊的需求或使用特定的跟踪方法来修改实体的状态。

其它状态下的实体如何操作

在 Entity Framework 中,EntityState 枚举表示实体对象在上下文中的不同状态。下面是 EntityState 枚举的常见值及其作用:

  1. Detached: 表示实体对象不受上下文跟踪,即实体未连接到上下文。这通常发生在实体是新创建的、已经被删除或从上下文中分离的情况下。
  2. Unchanged: 表示实体对象与数据库中的对应记录保持一致,没有任何修改。
  3. Added: 表示实体对象是一个新创建的对象,且尚未在数据库中进行插入操作。在调用 SaveChanges() 方法后,实体将被插入到数据库中。
  4. Modified: 表示实体对象的某些属性已被修改。在调用 SaveChanges() 方法后,EF 将会更新数据库中相应的记录。
  5. Deleted: 表示实体对象被标记为删除状态,即将从数据库中删除对应的记录。在调用 SaveChanges() 方法后,EF 将会从数据库中删除相应的记录。
    以上是 EntityState 枚举的常见状态值及其作用。这些状态值用于跟踪实体对象在上下文中的状态,并指导 EF 在调用 SaveChanges() 方法时执行相应的数据库操作。
    通过检查实体对象的状态,你可以了解对象在上下文中的变化情况,并根据需要执行相应的操作,如插入、更新或删除数据。
    在使用 Entity Framework 进行数据操作时,理解和正确使用实体状态是非常重要的,以确保数据的一致性和正确性。

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

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

相关文章

【UnityDOTS 小知识】如何通过DOTS修改材质属性以及替换材质与网格

如何通过DOTS修改材质属性以及替换材质与网格 一、DOTS修改材质属性 1.利用 Material Overide Asset Material Overide Asset是一个Unity资产&#xff0c;可以通过Create创建。 创建后指定要修改的材质&#xff0c;以及对应材质的属性&#xff0c;即可完成这个资源创建。 然…

hive关联键 NULL 关联 NULL

结论&#xff1a;关联键 NULL NULL时&#xff0c;不进行关联&#xff0c;即两表关联失败 案例如下&#xff1a; 表A 表B 表A 关联 表B selecta.id as a_id,a.name as a_name,b.id as b_id,b.name as b_name from表A a left join表B b on a.id b.id …

【FFmpeg实战】FFplay音视频同步

作者&#xff1a;Mirs 链接&#xff1a;https://www.jianshu.com/p/d7ead3a5f2bd PTS的由来 音视频同步依赖的一个东西就是pts&#xff08;persentation time stamp &#xff09;显示时间戳 告诉我们该什么时间显示这一帧 ,那么&#xff0c;这个东西是从哪里来的呢&#xff1f…

Jvm创建对象之内存分配-JVM(七)

上篇文章介绍了jvm创建&#xff0c;会校验是否已加载类&#xff0c;没有则加载&#xff0c;通过之前学的源码&#xff0c;classLoader加载完之后&#xff0c;虚拟机开始给类分配内存&#xff0c;指针移动分配和free链表分配&#xff0c;解决并发分配情况用cap和TLAB方法。之后设…

编写LED灯的驱动,创建三个设备文件,每个设备文件和一个LED灯绑定,当操作这个设备文件时只能控制设备文件对应的这盏灯

.编写LED灯的驱动&#xff0c;创建三个设备文件&#xff0c;每个设备文件和一个LED灯绑定&#xff0c;当操作这个设备文件时只能控制设备文件对应的这盏灯 实验现象 test.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <s…

【linux】使用 sftp 替换 vsftpd

为什么使用 sftp&#xff1f; 1. 基于 ssh 协议&#xff0c;保证数据安全性 2. 大多数防火墙不会阻止 ssh 协议 3. 完全基于文件系统权限对用户进行管理 4. 配置比 vsftpd 简单 另外&#xff0c;我在集成商工作服务于各大甲方&#xff0c;在厦门的一些企业&#xff0c;如&…

一步一步指导如何使用 FastSAM进行图像分割

它以50倍的速度实现了与SAM方法相当的性能。 (SAM) 是一个强大的视觉基础模型,可以根据用户交互提示分割图像中的任何对象。SAM 一经发布就因其准确性而在计算机视觉社区中获得了巨大的关注。然而,SAM 广泛使用计算量大的Transformer (ViT) 架构限制了其实际应用,特别是在…

C# NPOI操作Excel汇总

C#操作Excel有多种方法&#xff0c;如通过数据库的方式来读写Excel的OleDb方式&#xff0c;但是OleDb方式需要安装微软office&#xff0c;还可以通过COM组件方式操作Excel&#xff0c;也需要安装微软Excel。如果不想安装微软办公套餐可以使用ClosedXML、EPPlus、NPOI。本文主要…

【网络系统集成】VLAN实验

1.实验名称:VLAN实验 2.实验目的 在PacketTracer中进行模拟VLAN实验,完成“不同交换机相同VLAN间通讯”实验、“单臂路由”实验与“三层交换实现VLAN间通讯”实验,加深对VLAN间通讯相关知识的理解与掌握。 3.实验内容 3.1不同交换机相同VLAN间通讯 (1)拓扑结构图

STM32——关于时钟源的实际使用及解释

1、STM32内部有5个时钟源&#xff0c;分别为HSI、HSE、LSE、LSI、PLL。 HSE&#xff1a;高速外部时钟&#xff0c;可接石英谐振器、陶瓷谐振器&#xff0c;或者接外部时钟源&#xff0c;其频率范围为4MHZ~16MHZ。 LSE&#xff1a; 低速外部时钟&#xff0c;接频率为32.768KHZ…

ATFX国际:小非农ADP数据来袭,加息预期或再度升温

ATFX国际&#xff1a;每月发布一次的ADP数据是国际金融市场的大事件&#xff0c;它能够对周五发布的非农就业报告起到相对准确的前瞻作用。今日晚间20:15&#xff0c;美国6月ADP就业人数将发布&#xff0c;前值为增加27.8万人&#xff0c;预期值增加22.8万人&#xff0c;市场预…

【Quartus FPGA】EMIF DDR3 IP 仿真记录

EMIF (External Memory Interface) 是 Quartus 平台提供的 IP&#xff0c;用于实现高速存储器件接口与控制器。通过 Intel Quartus Prime 软件&#xff0c;可以很方便地实现 EMIF IP 电路。本文记录了使用 EMIF 实现 DDR3 控制器的仿真过程&#xff0c;软件平台为 Quartus Prim…

软件测试体系方案

目录 前言&#xff1a; 1. 引言 1.1 目标 1.2 背景 1.3 术语和定义 2. 测试体系完善 2.1 项目启动 2.2 测试计划 2.3 需求分析 2.4 测试设计 2.5 测试执行 2.6 测试记录 2.7 缺陷跟踪 2.8 测试结束 2.9 测试总结 3. 测试管理规划 3.1 测试人员 3.2 测试环境 …

骑行,怎么样高效而省力的摇车?

大家好&#xff0c;今天我们来聊一聊自行车运动中的摇车技巧。我们知道&#xff0c;摇车是自行车运动中一种非常高效的发力方式&#xff0c;那么如何做到高效而省力的摇车呢&#xff1f; 首先&#xff0c;我们要了解摇车的原理。摇车&#xff0c;其实就是通过腿部蹬踏的方式&am…

(02)Cartographer源码无死角解析-(78) ROS数据发布→2D点云数据、tf、机器人tracking frame轨迹发布

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

【MTK】ES7210、ES7243E Driver调试

文章目录 1.概要2.整体架构流程3. ES7210、ES7243E Driver4. 调试过程中的问题点小结1.概要 由于项目需要实现 4 路MIC 以及 2 路Speaker回采输入android系统,硬件是一个ES7210用来采集4路MIC,一个ES7243E用来采集2路Speaker回采,组成类似6路麦克风输入系统。系统SoC无法支持…

“前端刘德华”Pink老师送签名图书啦

就算成功的概率为1%又如何呢&#xff0c;如太阳系般波澜壮阔&#xff0c;也只有0.14%产生了生命&#xff0c;平凡的我们绝大多数也终将如整个太阳系的99.86%一般化作死寂。 但这不重要朋友&#xff0c;今天是黑马疯狂星期四&#xff0c;Pink老师开讲了&#xff01;&#xff01…

跑马灯实验(stm32)

目录 LED的功能代码led.cled.h硬件相关说明 main.c代码的一些介绍BSRR和BRR 实验结果 说明&#xff1a;以下内容参考正点原子的相关资料 LED的功能代码 led.c void LED_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_A…

单月涨粉30w,小红书涨粉秘诀是什么?

6月&#xff0c;小红书平台又涌现出哪些优质博主&#xff1f;品牌在投放种草方面有何亮眼表现&#xff1f; 为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出6月月度榜单&#xff0c;从创作者、品牌、品类多方面入手&#xff0c;解析月榜数据&#xff0c;为从…

耗时半月,终于把牛客网上的软件测试面试八股文整理成PDF合集!

大家好&#xff0c;最近收到不少小伙伴的留言&#xff0c;反映现在的面试难度越来越高&#xff0c;要背的八股文越来越多了&#xff0c;考察的知识点也越来越细致&#xff0c;明摆着就是想让我们“徒手造航母”嘛&#xff01;对程序员们来说确实是一大挑战。 因此&#xff0c;…