首页 > 其他分享 >Entity Framework教程-Entity Framework-实体变化跟踪.md

Entity Framework教程-Entity Framework-实体变化跟踪.md

时间:2022-10-27 12:22:10浏览次数:45  
标签:md 修改 状态 数据库 实体 DbContext Entity Framework SaveChanges

更新记录
转载请注明出处:
2022年10月27日 发布。
2022年10月22日 从笔记迁移到博客。

EF 实体变化跟踪

跟踪一个实体的时候,EFCore 会创建这个实体的快照。执行SaveChanges()等方法时,EF Core将会把存储的快照中的值与实体的当前值进行比较。

实体的状态

已添加(Added):DbContext正在跟踪此实体,但数据库中尚不存在该实体。
未改变(Unchanged):DbContext正在跟踪此实体,该实体存在于数据库中,其属性值和从数据库中读取到的值一致,未发生改变。
已修改(Modified):DbContext正在跟踪此实体,并存在于数据库中,并且其部分或全部属性值已修改。
已删除(Deleted):DbContext正在跟踪此实体,并存在于数据库中,但在下次调用SaveChanges时要从数据库中删除对应数据。
已分离(Detached): DbContext未跟踪该实体。

实体状态与SaveChanges()操作

“已分离"和“未改变"的实体,SaveChanges()忽略;
“已添加”的实体,SaveChanges() 插入数据库;
“已修改”的实体,SaveChanges()更新到数据库;
“已删除”的实体,SaveChanges() 从数据库删除;

DbContext会根据跟踪的实体的状态,在SaveChanges()的时候,根据实体状态的不同,生成Update、Delete、Insert等SQL语句,来把内存中实体的变化更新到数据库中。

ENTITYENTRY

使用DbContext的Entry()方法来获得实体在EF Core中的跟踪信息对象EntityEntry.EntityEntry类的State属性代表实体的状态,通过DebugView.LongView属性可以看到实体的变化信息。

EntityEntry el = ctx.Entry(EntityObject);
Console.WriteLine(e1.DebugView.LongView);

设置EF Core不进行查询跟踪

使用AsNoTracking()方法即可。

如果通过DbContext查询出来的对象只是用来展示,不会发生状态改变,则可以使用AsNoTracking()来“禁用跟踪”。如果查询出来的对象不会被修改、删除等,那么查询时可以AsNoTracking(),就能降低内存占用。

var result = db.Persons.AsNoTracking().Select(i=>i);

直接使用实体状态进行数据操作

属于奇淫技巧,实际使用场景不推荐使用。通常对数据库的数据进行操作的时候,需要先进行查询,然后获得指定的数据,然后再进行修改,最后在保存到数据库中。而如果使用直接修改数据实体的状态那么就不用进行先查询了,直接设置数据的状态为修改状态,然后保存数据即可。

实例:直接修改指定的实体数据。

//创建DbContext
using (TestDbContext db = new TestDbContext())
{
    //指定指定的数据
    Person person = new Person()
    {
        Id = Guid.Parse("5ea8d972-fbe7-41e2-93d6-08d9ec4c610c")
    };

    //直接修改数据的内容
    person.Name = "Panda666";
    //直接修改实体的数据状态为修改状态
    db.Entry(person).State = EntityState.Modified;
    //保存修改
    await db.SaveChangesAsync();
}

实例:直接删除指定的实体数据。

设置数据的状态为删除状态即可。通常删除数据,需要先进性查询到指定的数据,而是用这种方式后,直接修改数据的状态为删除状态。然后调用保存方法,就会自动删除数据。

using PandaTest;
using Microsoft.EntityFrameworkCore;

Console.WriteLine("Begin");

//创建DbContext
using (TestDbContext db = new TestDbContext())
{
    //指定指定的数据
    Person person = new Person()
    {
        Id = Guid.Parse("5ea8d972-fbe7-41e2-93d6-08d9ec4c610c")
    };

    //直接修改实体的数据状态为删除状态
    db.Entry(person).State = EntityState.Deleted;
    //保存修改
    await db.SaveChangesAsync();
}

Console.WriteLine("Success");

标签:md,修改,状态,数据库,实体,DbContext,Entity,Framework,SaveChanges
From: https://www.cnblogs.com/cqpanda/p/16820810.html

相关文章

  • Python操作数据库与MD5加密
    #md5加密importhashlibm=hashlib.md5()m.update("123456".encode('utf-8'))ret=m.hexdigest()print(ret)#数据库操作pymysql安装pymysqlimportpymy......
  • .MD语法入门,教你写好readme文档
    .md即markdown文件的基本常用编写语法,是一种快速标记、快速排版语言,现在很多前段项目中的说明文件readme等都是用.md文件编写的,而且很多企业也在在鼓励使用这种编辑方式,特......
  • 【leetcode_C++_字符串_day7】344_反转字符串&541_反转字符串II&&剑指Offer_05_替换空
    344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)......
  • 判断一个实体类entity对象是否为空
    /***判断实体对象是否为空*@paramobjectentity对象*@returnboolean*/publicstaticbooleancheckObjAllFieldsIsNull(Objectobject){//如果对象为null直接......
  • Entity Framework教程-异步和并发操作(Asynchronous And Concurrency Operations)
    更新记录转载请注明出处:2022年10月26日发布。2022年10月22日从笔记迁移到博客。待完善C#综合揭秘——EntityFramework并发处理详解-风尘浪子-博客园(cnblo......
  • cmd 中常用 Command 总结
    1-输出内容重定向:cmd中有时需要将输出的内容重定向到本地的txt文本中,此时可以使用>或>>,>直接覆盖之前的内容:Test.exe>out.txt将输出的内容写入out.txt文......
  • 安卓Material Desigh常用代码介绍1——MD的介绍。
    首先说明一点,这博客属于笔记的一种,所以缘由介绍什么的都省略了。前期就主要写写代码。想到啥写啥。深入的问题,等水平提高之后再说。对于MD,按照我的理解不完全分类可分为七部......
  • rest_framework权限源码分析
    位置APIView---->dispatch方法---->initial方法--->self.check_permissions(request)(APIView的对象方法)分析defcheck_permissions(self,request):"""Chec......
  • rest_framework认证源码分析
    认证源码分析位置:APIVIew----》dispatch方法---》self.initial(request,*args,**kwargs)---->有认证,权限,频率三个版块分析:只读认证源码:self.perform_authenticatio......
  • 阿里云市场AtomData购买与部署指南
    本文主要描述企业用户如何从阿里云市场购买、使用石原子公司的AtomData企业级实时数仓产品。1、购买1.1找到商品通过阿里云官网的云市场类目进入云市场首页,搜索AtomData......