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

这篇具有很好参考价值的文章主要介绍了.net项目开发-EF框架解决添加默认值问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近开发.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类的一个数据库会话类
.net项目开发-EF框架解决添加默认值问题,数据库,EF,.net
关于这个类的实体项目的配置这里暂时不做说明,大家可以查询一下这个相关的配置有很多,就不在这里说了,直奔主题

重写SaveChanges()方法

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

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

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

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

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

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

        /// <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 枚举的常见值及其作用:文章来源地址https://www.toymoban.com/news/detail-541012.html

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

到了这里,关于.net项目开发-EF框架解决添加默认值问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Spring框架进行Web项目开发(初级)

    目录 前言 1. 为什么常规的Spring框架不适合Web项目呢? 2. 如何在Spring框架中创建容器? 3. Spring框架开发Web项目的步骤 3.1 创建maven项目 3.2 添加相应的依赖 3.3 在webapp目录下的web.xml中注册监听器 3.4 在webapp文件夹下的web.xml中配置Servlet控制器 3.5 自定义控制器  总结 我们在初步

    2024年01月19日
    浏览(47)
  • 推荐一个.Net Core开发的Websocket群聊、私聊的开源项目

    今天给大家推荐一个使用Websocket协议实现的、高性能即时聊天组件,可用于群聊、好友聊天、游戏直播等场景。 这是一个基于.Net Core开发的、简单、高性能的通讯组件,支持点对点发送、群聊、在线状态的订阅。 该项目还包含群聊例子,可以用于学习。 1、跨平台:基于.N

    2024年02月03日
    浏览(58)
  • 若依框架快速开发项目(避坑超详细)

    初衷: 若依框架使用及其普遍,是一个非常优秀的开源框架,框架本身的权限系统,字典设置以及相关封装,安全拦截相当完善,本人受益匪浅,学学到了许多,在这里,先向原创作者致敬! 本人刚刚接触这个框架的时候,很迷茫,几乎没有入手的地方,不知道怎么去开始

    2024年02月04日
    浏览(42)
  • springboot项目开发,使用thymeleaf前端框架的简单案例

    springboot项目开发,使用thymeleaf前端框架的简单案例!我们看一下,如何在springboot项目里面简单的构建一个thymeleaf的前端页面。来完成动态数据的渲染效果。 第一步,我们在上一小节,已经提前预下载了对应的组件了。 如图,springboot的强大之处就在于,它有一套完整的版本依

    2024年01月25日
    浏览(38)
  • 【开源】SpringBoot框架开发企业项目合同信息系统

    基于JAVA+Vue+SpringBoot+MySQL的企业项目合同信息系统,包含了合同审批模块、合同签订模块、合同预定模块和合同数据可视化模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,企业项目合同信息系统

    2024年02月20日
    浏览(49)
  • GO 的 Web 开发系列(二)—— Web 项目的技术框架选择和项目搭建

    Web 系统搭建第一步,选择技术框架,完成 Hello World 。 小玖用的 Go 版本是 1.21.6 介绍项目的技术选型个结构,不包括代码。 全文链接:https://blog.nineya.com/archives/149.html Web 框架: github.com/gin-gonic/gin v1.9.1 调研了 Go 开发者一圈,给小玖推荐这个框架的人最多 :tushe: 主要优点是轻

    2024年01月25日
    浏览(54)
  • Python Flask框架-开发简单博客-项目布局、应用设置

    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,只在于他所拥有的。所以可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路

    2024年02月02日
    浏览(47)
  • 【微信小程序独立开发1】项目提出和框架搭建

    前言:之前学习小程序开发时仿照别人的页面自己做了一个商城项目和小说项目,最近突发奇想,想从0开发一个关于《宠物日记》的小程序,需求和页面都由自己设计,将在这记录开发的全部流程和过程中遇到的难题等...  首先创建小程序项目,AppID在微信开发者页面自己申

    2024年01月22日
    浏览(80)
  • SpringBoot项目使用CXF框架开发Soap通信接口

    物料准备: 1.引入cxf官方提供的SpringBootStarter依赖 2.定义需要暴雷给外部调用的java接口以及接口的实现类 3.配置CxfConfig类,把你定义的java接口注册为webservice的Endpoint 这里因为我用的springboot版本是2.4.2的,所以这里选择引入的是3.2.4版本的cxf框架,不建议引入更高的版本。 接

    2024年02月10日
    浏览(39)
  • 若依框架快速开发项目(不涉及底层逻辑,只是简单使用)

    初衷: 若依框架使用及其普遍,是一个非常优秀的开源框架,框架本身的权限系统,字典设置以及相关封装,安全拦截相当完善,本人受益匪浅,学学到了许多,在这里,先向原创作者致敬! 本人刚刚接触这个框架的时候,很迷茫,几乎没有入手的地方,不知道怎么去开始

    2024年02月03日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包