entity-framework-core - 我什么时候想使用 Add 方法,而不是 Attach 方法?
问题描述
我知道关于课程之间的区别Add
和Attach
方法存在现有/较旧的问题DbSet<TEntity>
。需要明确的是,我不会再问这个问题了。我知道它们是如何工作的以及它们之间的功能差异。
我从他们在幕后所做的事情(如他们的文档中所述)中了解到的是,Attach
完全涵盖了Add
's 的功能(如果我错了,请纠正我)。更好的是,它以更谨慎的方式执行此操作(在断开连接的图中,将实体标记为Unchanged
而不是Added
如果它具有 PK 值集)。
这就是让我想知道该Add
方法存在背后的原因的原因。我主要将 EF Core 与断开连接的实体一起使用,并且可能存在我不知道的情况。
Add
那么,由于该Attach
方法不合适,我可能想要使用该方法的可能情况是什么?
解决方案
我看到两个原因:
使代码不言自明。如果您创建一个新的实体对象,
Add
它,不要Attach
它。并非所有开发人员都会理解附加实体可能会将其标记为Added
.强制将实体标记为插入。例如,当“克隆”现有实体时(即将其保存为新的数据库记录)。EF 会将现有实体标记为
Added
与其键值无关,并将其作为新行插入数据库中。
至于第二点,当主键自动生成时,在 EF6 中,这就是它的全部内容,EF 将插入实体并从数据库中获取其新的键值。EF 核心将尝试使用现有键值插入新实体,因此您首先必须清除它们,即将它们设置为默认值。
简而言之:当附加可能是新实体或现有实体的任意组合的对象时,Add
用于旨在添加数据的代码。Attach
推荐阅读
- javascript - 插入多行物料表
- r - 如何在 R 中对稀疏矩阵进行交叉制表?
- java - 将数据库异常信息传输到客户端的最佳实践
- spring-boot - 如何避免 Spring 框架中的 CustomConversions 警告
- kubernetes - 为什么当我查询正在运行的 Pod 时,kubectl 返回具有“Terminating”状态的 Pod?
- visual-studio - 如何在 VS2019 中静态链接 OpenSSL 库?
- flutter - 重新启动时在 null 上调用了方法“[]”
- android - 从 AppGallery Connect API 获取错误代码 204144647 并显示消息“新服务无法编辑服务,无法更新”
- matrix - 仅显示此热图的对角线值
- flutter - 数据未存储在 Firestore 中,但用户的身份验证信息在 Firebase 身份验证中可用