Entity Framework教程-实体变化跟踪.md
更新记录
转载请注明出处:
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");
作者:重庆熊猫
出处:https://www.cnblogs.com/cqpanda/p/16820810.html
版权:本作品采用「不论是否商业使用都不允许转载,否则按3元1字进行收取费用」许可协议进行许可。
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16820810.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战