• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

EF Core 保存操作 saveChange

武飞扬头像
chchch521761
帮助1

更新数据原理:
数据库中有主键所对应的记录,修改实体到 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
系列文章
更多 icon
同类精品
更多 icon
继续加载