做爰明星视频网站,wordpress添加随机图片,企业型网站建设方案,东莞市电池网站建设推荐关注「码侠江湖」加星标#xff0c;时刻不忘江湖事这是 EF Core 系列的第六篇文章#xff0c;上一篇文章讲述了 EF Core 中的原始 SQL 语句查询。这篇文章讲一讲 EF Core 如何修改实体数据。点击上方或后方蓝字#xff0c;阅读 EF Core 系列合集。实体状态在开始学习 EF… 推荐关注「码侠江湖」加星标时刻不忘江湖事这是 EF Core 系列的第六篇文章上一篇文章讲述了 EF Core 中的原始 SQL 语句查询。这篇文章讲一讲 EF Core 如何修改实体数据。点击上方或后方蓝字阅读 EF Core 系列合集。实体状态在开始学习 EF Core 修改数据之前我们必须要熟悉 EF Core 中的一些机制。前面的内容中我们讲到 DbContext 包括三个属性ChangeTracker、Database 和 Model。之前的示例中Database 和 Model 我们都有用到过那么 ChangeTracker 是做什么的ChangeTracker 属性提供了对当前加载的实体的变化跟踪信息和操作的访问。当我们想执行任何数据库修改操作时无论是创建、修改还是删除一个实体EF Core 都有关于跟踪和操作的信息。为什么要保存这些信息呢因为在 EF Core 中修改实体属性的值并不会直接被保存到数据库中。而是要我们调用 SaveChanges 方法EF Core 才会将修改反应到数据库在此之前EF Core 不会执行任何操作。因此在调用 SaveChanges 方法之前 EF Core 需要知道我们都执行了什么操作这对 EF Core 来说非常重要。每一个被追踪的实体都有附属于它的 State 属性。当我们使用上下文对象加载实体而不使用 AsNoTracking 方法时或者我们通过 Update、Remove 或 Add 方法改变实体状态时该实体都会成为被跟踪的实体。状态属性的值可以通实体的 State 方法获得。那么实体的状态有哪些呢「Detached」 - 该实体没有被追踪调用 SaveChanges 方法不会有任何效果「Unchanged」 - 该实体从数据库中加载但没有任何变化。调用 SaveChanges 方法也不会有任何效果「Added」 - 该实体不存在于数据库中调用 SaveChanges 方法会将其添加到数据库中。「Modified」 - 该实体存在于数据库中并被修改过因此调用 SaveChanges 方法将在数据库中修改它「Deleted」 - 该实体存在于数据库中调用 SaveChanges 方法会将它从数据库中删除。实体操作接下来让我们结合示例来演示增删改并观察实体状态的变化var account new Account
{Name 张三,Age 18
};
_context.Add(account);
_context.SaveChanges();示例中首先创建了一个 account 对象此时它还未被附加到 EF Core 上下文中它的状态应该是 Detached。当我们使用 Add 方法将account对象作为实体添加到上下文后它的状态应该是 Added。紧接着使用 SaveChanges 方法将新添加的实体保存到数据库中它的状态应该是 Unchanged。当我们再次修改实体中的任意属性时它的状态会变成 Modified。// ...
account.Age 20;
_context.SaveChanges();使用 SaveChanges 方法将已修改的实体应用到数据库时它的状态又会变回 Unchanged。最后当我们从上下文中删除这个实体后实体的状态会变成 Deleted。// ...
_context.Remove(account);
_context.SaveChanges();再次使用 SaveChanges 方法将实体从数据库中彻底删除大家想一想此时它的状态依然会变成什么这次可不是 Unchanged 了因为它已经从上下文中被移除了所以它的状态是 Detached。EF Core 正是用这么几个方法对实体进行增删改。当然这只是其中一种方式。在这个示例中新增的对象经过 Add 方法被添加到了上下文。之后的更新和删除操作都是针对实体已经存在于上下文中的情况。那么如果我们有一个对象它不存在于上下文中但它确实存在于数据库中我们该如何对它就行更新或删除呢首先你肯定不能用 Add 方法虽然它可以将一个对象作为实体添加到上下文中但它还会使实体状态成为 Added而不是 Modified这种情况下执行 SaveChanges 方法EF Core 只会生成插入数据的语句肯定会造成数据库冲突因为数据已存在。比如这个对象var account new Account
{Id new Guid(dd4feb0b-b57c-4338-a40a-7aa73fc6e460),Name Zilor,Age 99
};实际开发中它可能来自的客户端这个对象的数据是经过之前的查询得到的。现在客户端对它的属性进行了修改主键肯定是不会变的。此时它的状态是 Detached没有被附加到上下文中我们该如何直接更新到数据库呢这里有两种方法可以做到一是先用 ID 从 EF Core 中查询出实体然后用 account 对象中的属性值修改实体中的值再使用 SaveChanges 保存数据。比如这样var dbAccount _context.Accounts.FirstOrDefault(a a.Id account.Id);
dbAccount.Name account.Name;
dbAccount.Age account.Age;
_context.SaveChanges();需要注意的是如果修改的操作没有造成实体值的任何变化实体状态将仍是 Unchanged。此时即便执行SaveChanges方法 也不会有任何效果。二是用附加方法将 account 对象附加到上下文然后手动修改它的状态再使用 SaveChanges 保存数据。比如这样var account new Account
{Id new Guid(dd4feb0b-b57c-4338-a40a-7aa73fc6e460),Name Zilor,Age 99
};_context.Accounts.Attach(account);
_context.Entry(account).State EntityState.Modified;
_context.SaveChanges();Attach 方法用来附加实体被附加的实体初始状态为 Unchanged所以我们要手动修改实体状态。执行应用可以看到实体状态的流转。第二种方式相对第一种方式少了一步查询也少了实体属性的赋值。但是无论实体的值相对于数据库是否有变化更新操作都会执行。这是方式适合全量更新因为如果客户端传来的是不完整的对象只包含了修改的属性那么更新时可能会造成问题。比如这个例子如果 Account 对象中没有 Age 属性更新到数据库时Age 列的值会是个 「Null」。第一种方式由于是从实体查询出来的数据数据是完整的修改也只是针对个别属性所以保存数据时不会发生这种情况。而且第一种方式可以判断出实体是否真的已经修改无修改的话不会执行任何操作。所以对于更新操作建议使用第一种方式更安全也更靠谱删除操作也是如此只需要将实体状态修改为 Deleted就可以直接删除不够删除操作可以使用第二种方式。更多精彩内容请关注我▼▼如果喜欢我的文章那么在看和转发是对我最大的支持戳下面蓝字阅读ASP.NET 6 中间件系列ASP.NET 最通俗易懂的依赖注入系列查缺补漏系统学习 EF Core 6 系列老子不亏是程序员的祖师爷不得不知的超精简 HTTP 协议推荐关注微信公众号码侠江湖 觉得不错点个在看再走哟