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

news/2024/4/21 0:38:34/

文章目录

  • 前言
  • 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.ppmy.cn/news/758198.html

相关文章

Perfetto 命令行工具(Android 10 及更高版本)

Perfetto 命令行工具&#xff08;Android 10 及更高版本&#xff09; 1、快速入门1.1 启动跟踪服务1.2 记录跟踪1.2.1 通过 Perfetto UI 记录跟踪1.2.2 通过 cmdline 记录跟踪1.2.3 System Tracing 的系统级应用抓取 2、perfetto 工具2.1 数据源选择2.2 语法参数2.2.1 轻量模式…

[原创]取学生姓名和成绩

[个人原创&#xff0c;如转载请说明出处] 昨天csdn bbs上有人发帖问取一段文本中学生姓名和成绩的问题。看了看&#xff0c;确实数据没有什么规律。 这里是设置的数据&#xff08;略有改动&#xff09;xuesheng "林川瑜 04财&#xff08;2&#xff09;班 川俊青74-63 全…

浏览器console发送get或post请求

浏览器console发送get或post请求 get请求 var url "http://******:8080/base/testapi/testcurl?urlhttps%3A%2F%2Fwww.baidu.com%2F"; var xhr new XMLHttpRequest(); xhr.open("GET", url, true); xhr.setRequestHeader("Content-Type", &…

re模块的使用

re.findall(parttern,string,flag) import re x The car parked in the garage. print(re.findall(r[^c]ar,x))结果返回列表 [par, gar]re.finditer(pattern, string, flags0) 这种方式效率更高 import re x The car parked in the garage. resultre.finditer(r[^c]ar,x) …

Redis通用命令数据结构

目录 Redis通用命令 官网查看不同命令https://redis.io/commands/ help命令&#xff1a;查询各种命令用法 keys命令&#xff1a;查看符合模板的所有key Redis的key结构 ​编辑 数据结构 String类型 String常用指令 Hash类型 Hash常用命令 List类型 List常用命令 …

使用傲腾内存加速的电脑(神舟)安装Ubuntu双系统

先声明一下我的电脑配置&#xff0c;我的电脑型号是神舟K670E&#xff0d;G6T3&#xff0c;win10操作系统&#xff0c;装有16g傲腾加速盘。 其实&#xff0c;搞计算机真的不要买神舟。没办法我已经买了&#xff0c;好不容易才装好双系统&#xff0c;也希望这个帖子能帮到…

【文生图系列】文生图大模型合集与效果对比

文章目录 DELL EDELL E 1DELL E 2 ERNIE-ViLGERNIE-ViLG 1ERNIE-ViLG 2Paddlehub ImagenMidjourneyStable DiffusionAltDiffusioneDiff-I阿里通义 DELL E DALLE到目前为止有两个版本&#xff0c;2021年1月&#xff0c;OpenAI发布了DALLE&#xff1b;2022年,DALLE 迎来了升…

java 遍历目录 树 递归 控制深度 层数

控制递归深度 在查询数据库树结构或者目录时&#xff0c;通常需要控制深度&#xff0c;或者到第几层。 import java.io.File; import java.util.*;public class test4 {public static List<File> findFiles(File files, int count) {List<File> result new Arr…

在word修订模型下,删除某行,发现行号不连续。

那是因为&#xff0c;你没有接受删除的修订。默认是把你修订的东西&#xff0c;给占行了&#xff0c;你去接受修订即可。另外&#xff1a;好人一生平安。

word的文档修订功能

**我们平时用word,都是在普通的编辑状态&#xff0c;如果你进入“修订”模式【点“工具”——“修订&#xff08;T&#xff09;”进入该模式&#xff1b;或双击word最下面灰色的“修订”。这些操作再重复一次&#xff0c;就又回到普通模式了】&#xff0c;当你再删除文字等时候…

word修改模式下如何一次性接受所有的修改

word修改模式下如何一次性接受所有的修改 从去年就实行了无纸化办公&#xff0c;这个个问题一直没有重视&#xff0c;也没花心思&#xff0c;不过今天又遇到了&#xff0c;文章中有不好领导的改动的地方&#xff0c;一个个的手工接受很是麻烦&#xff0c;所以在网上找了找&…

将Word修订版本保存成最终格式

打开文档后&#xff0c;点击 工具条 上的”审阅“&#xff0c;然后点击”接受“&#xff0c;再点击下拉框中的”接受对文档的所有修订“&#xff0c;就会显示文档的最终状态&#xff0c;保存即可。

Word2019文档中修订功能

1、启用修订 打开原始文件&#xff0c;在“审阅”选项卡下单击修订”组中的“修订”下三角按钮&#xff0c;在展开的下拉列表中单击“修订”选项。 2、查看修订文本的效果 此时进入修订状态&#xff0c;用户可以参照批注对文档进行修改&#xff0c;删除和插入的内容均会被标记出…

Word修订模式:打字输入很慢怎么办?

或许你使用Office16版本&#xff0c;当在修改完善论文的时候&#xff0c;导师要求你采用修订模式&#xff0c;于是乎&#xff0c;整页整页的修订痕迹。 当然最难搞的是&#xff0c;打字输入延迟两三秒&#xff0c;等你字都打完了&#xff0c;需要自行等待。 此时的心情&#xf…

web安全php基础_php常量及可变变量(魔术变量)

常量 php中常量是一个简单值的标识符。该值在脚本中不能改变。 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。 常量有两点需要特别注意的地方 常量在整个脚本中都可以使用。常量值被定义后&#xff0c;在脚本的其他任何…

JavaScript实现归并排序算法详解

JavaScript实现归并排序算法详解 说明 归并排序&#xff08;Merge Sort&#xff09;算法&#xff0c;也叫合并排序&#xff0c;是创建在归并操作上的一种有效的排序算法。算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用&#xff0c;且各层…

idea集成maven-mvnd

maven-mvnd是什么&#xff1f; 参考文档&#xff1a; Maven加强版 — mvnd的使用测试 - 知乎 1.下载mvnd安装包 Releases apache/maven-mvnd GitHub 2.修改配置文件&#xff1a;安装包中的conf目录下的mvnd.properties文件 配置maven settings的地址&#xff1a; 注意&am…

中兴通讯服务器r5400,至强5400系列处理器

处理器与内存系统 接下来&#xff0c;就让我们来看一下浪潮英信NF280D最引人注目的一个部件&#xff0c;基于英特尔45nm平台的高-k至强5400系列处理器。 45纳米高-k四核英特尔至强5400系列处理器在主要工业标准基准测试中创造了多项世界记录**。HP Proliant DL380 G5服务器以27…

关于PHP 使用 Elastic Search8的相关经历

你好&#xff01; 如果你也是第一次使用ES8和PHP对接使用&#xff0c;这里或许有一些心得可以为你解决一些问题。 本地环境所需工具 windows 版本搭建 Elastic Search 如下图&#xff0c;通过官网下载一个windows版本的Elastic Search 执行.bat文件即可启动 https://localhos…

LED灯的驱动

编写LED灯的驱动&#xff0c;创建三个设备文件&#xff0c;每个设备文件和一个LED灯绑定&#xff0c;当操作这个设备文件时只能控制设备文件对应的这盏灯。 head.h #ifndef __HEAD_H__ #define __HEAD_H__typedef struct{unsigned int moder;unsigned int otyper;unsigned in…