EF Core 保存操作 saveChange
更新数据原理:
数据库中有主键所对应的记录,修改实体到 Modified 状态,调⽤ SaveChanges 时,⽣成 Update 语句。
一、更新已跟踪实体的数据
当实体由 DbContext 获取,且默认为已为跟踪状态,当我们改变实体的属性值时,跟踪器将⾃动将实体的状态修改为 Modified 状态。
var blog = context.Blogs.First();
blog.Url = "www.xcode.me";
context.SaveChanges();
二、更新未跟踪实体的数据
对于未被跟踪的断开实体,可通过以下三种⽅案更新数据。
1、Entry 显式设置 EntityState 状态
Blogs blog = new Blogs()
blog.name="我的博客";
context.Entry(blog).State = EntityState.Modified;
context.SaveChanges();
2、Update 在DbContext 或DbSet 上使⽤Update ⽅法
context.Update(blog);
context.SaveChanges()
比较
相同点: Update ⽅法与设置 EntityState ⽅案⼀样,会将实体状态设置为 Modified 状态。由于跟踪器没有任何⽅法来识别哪些属性值已经更改,所
以⽣成的 UPDATE 语句会更新所有字段属性。
不同点:Update ⽅法与显⽰设置设置 EntityState 不同的是,Update ⽅法会修改相关实体(如 Blog 的 Posts 导航属性)的状态为已修改,从⽽会为
每个实体⽣成 UPDATE 语句。如果相关实体没有对应的键值,就会标记为 Added 状态,⽣成⼀条 Insert 语句。
3、Attach属性的状态跟踪, 在DbContext 或DbSet 上使⽤Attach ⽅法,然后遍历对象图,设置各个属性的状态。
当在已设置键值的实体上使⽤Attach ⽅法时,它的状态将被设置为Unchanged 未修改状态,这将导致根本不会⽣成任何 SQL 语句。
当在没有键值的实体上使⽤ Attach ⽅法时,⼀个 Detached 游离状态的实体将被标记为 Added 已添加状态。
context.Entry(entity).IsKeySet
不管怎么说,调⽤ Attach ⽅法后,该实体将被跟踪器跟踪,我们可以通知跟踪器哪些属性被修改,⽣成正确的
UPDATE 语句,⽽不是更新所有字段,这也许会获得更好的性能。
以下代码,⽣成的 UPDATE 语句只会更新 Name 属性。
var blog = new Blog
{
BlodId=1,
Name="ZEROBLOG",
Url = "www.xcode.me",
Posts = new List<Post>
{
new Post { Title = "Intro to C#" },
new Post { Title = "Intro to VB.NET" },
new Post { Title = "Intro to F#" }
}
}
_context.Attach(blog);
_context.Entry(blog).Property("Name").IsModified = true;
_context.SaveChanges();
如果实体不使⽤⾃动⽣成的键,则应⽤程序必须确定是应插⼊实体还是应更新实体:
public static void InsertOrUpdate(BloggingContext context, Blog blog)
{
var existingBlog = context.Blogs.Find(blog.BlogId);
if (existingBlog == null)
{
context.Add(blog);
}
else
{
context.Entry(existingBlog).CurrentValues.SetValues(blog);
}
context.SaveChanges();
}
TrackGraph API 提供了对对象图中各个实体的访问,并允许您对每个实体分别执⾏定制代码。这在处理这种由不同对象的相关实体的复杂
对象图的场景中⾮常有⽤。下⾯的⽰例复制了⼀个场景,其中对象图是在Context之外构造的。
以下⽰例,⽆论如何修改 Blog 或者 Post 的属性值,只有 Post 的 Title 字段会被更新。
var blog = new Blog
{
BlogId = 1,
Name = "zerodo",
Url = "www.xcode.me",
Posts = new List<Post>
{
new Post { PostId=1, Title = "Intro to C#",Content="AAA" },
new Post { PostId=2, Title = "Intro to VB.NET",Content="BBB" },
new Post { PostId=3, Title = "Intro to F#" ,Content="CCC"}
}
};
context.ChangeTracker.TrackGraph(blog, e =>
{
if (e.Entry.Entity is Blog)
{
e.Entry.State = EntityState.Unchanged;
}
if (e.Entry.Entity is Post)
{
e.Entry.State = EntityState.Unchanged;
context.Entry(e.Entry.Entity as Post)
.Property("Title").IsModified = true;
}
});
context.SaveChanges()
更改关系
var blog = new Blog { Name = “zeroblog”, Url = “www.xcode.me” };
var post = context.Posts.First();
post.Blog = blog;
context.SaveChanges();
更改关系:可设置导航属性(不存在则创建),也可设置外键的值。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfikikc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01