- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在更新 EF Core 中的实体然后在表中记录这些更改时遇到了问题。使用的技术是:
所以,我想从数据库中获取一个实体,在前端对其进行编辑,然后在后端对其进行更新,并将这些更改保存到数据库中。最重要的是,我有一个名为 ChangeLogs
的表,其中最重要的字段是 From(映射自 OldValues
)和 To(映射自 CurrentValues
).嗯,这两个字段是相同的(意味着它们具有完全相同的值,新值)并且情况是这样的:
我这样从数据库中获取实体
_context.Anomalies
.Include(a => a.Asset)
.FirstOrDefaultAsync(a => a.Id == anomalyId)
在前端编辑实体,然后发起PUT请求更新实体;
更新实体:
为了使 Update()
工作,首先我必须调用它:_context.DetachAllEntities();
否则我会收到一条错误消息,指出已跟踪具有相同 ID 的实体。然后调用 Update()
和 SaveChanges()
:
_context.Anomalies.Update(异常);
_context.SaveChanges();
异常
对象是来自请求的对象。
对于 ChangeLog
部分,我在 this example 之后重写了 SaveChanges()
方法,旧/原始值和新/当前值设置如下:
auditEntry.OldValues[propertyName] = property.OriginalValue;
auditEntry.NewValues[propertyName] = property.CurrentValue;
基本上这会遍历 ChangeTracker
中的所有条目,创建一个 AuditEntry
并在 base.SaveChanges()
之后返回并设置该 AuditEntry 的 EntityId,因为您在保存更改之前没有它(这是为了防止您添加新实体,对于更新,保存更改后没有任何反应)。
Update() 方法正在运行,更改反射(reflect)在数据库中。但唯一的问题是 ChangeLogs
,来自 ChangeTracker.Entries()
的条目不知道 OldValues
。
我承认我不完全了解 EF 使用的跟踪系统,但我想它应该可以帮助我更新实体而不是产生问题。因为我知道调用 _context.DetachAllEntities();
是不正确的。我尝试使用 AsNoTracking()
并删除 DetachAllEntities()
但结果似乎是一样的。我想过使用 dbEntity,将每个字段从请求实体复制到数据库实体,然后 Update(dbEntity)
但这似乎需要做很多工作,基本上只是为了获得一点好处。我的 Anomaly
实体有很多导航属性,很难为其创建复制方法并进行维护。
DetachAllEntities()
定义如下:
public static void DetachAllEntities(this DbContext context)
{
var entries = context.ChangeTracker.Entries().ToList();
foreach (var entry in entries)
{
entry.State = EntityState.Detached;
}
}
DbContext
设置为 Scoped
生命周期,管理器也是如此。
我尝试使用来自 this tutorial 的审核方法也一样,但结果是一样的。
我担心整个更新过程没有正确完成,因此出现了这个问题..
UPDATE I have created a sample project to exemplify this problem. You can check the source code on bitbucket. The README hase some more info on this
我序列化了从上下文中检索到的对象。
欢迎任何建议、意见、新想法、评论。谢谢!
最佳答案
我想你的问题就在这里。因为这两个对象存在于不同的上下文中,所以从根本上说是不同的对象。如果更改代码以便从数据库中检索实体,更新其值,然后使用该对象传递给 SaveChangesAndAudit() 方法。你会得到你期望的结果。我已经调整了所附屏幕截图中的代码。您还会遇到大多数开发人员发现的一个基本问题,那就是映射对象——像 Automapper 这样的工具可以让您的生活更轻松——所以如果您的实体很大,那么值得一看以提供帮助; -)
关于c# - ChangeLog OriginalValue 与 EF Core 更新实体上的 CurrentValue 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56233528/
版本:Apache Maven 3.0.5 我通过 maven 站点插件和命令 mvn site 成功生成了一个 changelog.xml。 pom.xml 的站点插件内容: org.ap
有什么方法可以自动生成从提交消息到 GitHub 存储库中名为 CHANGELOG.md 的文件的更改日志? 是否可以在存储库上使用服务 Hook ? 最佳答案 几个月前我写过类似的东西。它基于 Gi
我在将liquibase与springboot集成时遇到问题。 我在pom文件中添加了liquibase依赖项,如下所示: org.springfr
当我尝试在 Jenkins 的后期构建操作中使用 git changelog 时,我收到一条错误消息,提示无法在类路径 (changelog.mustache) 或文件系统 (/changelog.m
是否有使用 TFS 2010 和文件版本历史记录创建更改日志的自动方法?我想提取标签(或特定日期)和当前版本之间或两个标签(或两个特定日期)之间为每个变更集输入的所有评论。 最佳答案 尝试使用 htt
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我有一个数据库(测试)和一个表(示例)。示例具有属性 id(int)、name(varchar)。然后我决定使用 liquibase 生成 changeLog 文件。现在,如果我决定向表中添加一个新属
我在 IntellijIDEA 11.1.3 中创建了新的 Grails 项目并尝试运行它。 当我打开 http://localhost:8080/application/dbdoc(访问 Contr
错误运行命令: grails dbm-generate-changelog changelog.groovy 命令行输出: 什么地方出了错: 任务“:dbmGenerateGormChangelog”
我正在尝试删除下游变更日志中值为 null 的记录,我知道在状态存储中它们只是通过为 null(逻辑删除)而被删除,但是当您对 KTable 或 Stream 进行聚合时,它们会跳过null 并且不删
我有一个带有两个模块的模块化Spring Boot应用程序: 应用程序模块,包含SpringBootApplication和业务逻辑。 包含所有Liquibase依赖项,更改日志和sql文件的数据库模
通过使用 liquibase 我们可以为整个数据库生成变更日志,但我想为选定的表而不是整个数据库生成变更日志。 有人对此有想法吗? 最佳答案 目前还没有对它的支持,但我今天打算看看它。关注https:
我想在我的 pom.xml 中配置更新日志插件... 但是有一个 reportSets 部分,所以我想知道我必须把插件放在哪里? 可能进入 scm 插件的配置部分(reportPlugins,...)
我有一个使用更新状态存储的处理器 api 的拓扑结构,配置复制因子为 3,acks=ALL Topologies: Sub-topology: 0 Source: products-so
我正在使用Grails 3.1.6,并且在与数据库迁移一起使用时(Game.groovy是我的模型): grails dbm-generate-gorm-changelog-add createGam
jhipster --version 5.3.4 我正在评估 JHipster 并测试它如何处理数据库 DDL 修改。在我的测试中,我创建了一个 Jhipster 项目,然后运行 jhipster
https://wiki.jenkins-ci.org/display/JENKINS/Git+Changelog+Plugin 首先,我只能看到屏幕截图中的内容,找不到“在作业摘要页面上打印”和“创
有什么方法可以将 Jenkins 生成的更改日志导入电子邮件的主题(通过默认电子邮件或 email-ext plugin )? 我是 Jenkins 配置的新手,如果这是一个简单的问题,我深表歉意,但
在版本控制中使用源代码时,我想部分自动创建 GNU 样式的 ChangeLog 条目。 add-changelog-entry-other-window一次处理一个文件,您必须访问该文件才能使用它。
与 2008 年相比,TFS 2010 中是否存在错误修复或类似问题的列表?我们在 2008 年遇到了一些问题,不确定这些问题是否在 2010 年得到解决。 具体: TFS 2008 有时会删除变更集
我是一名优秀的程序员,十分优秀!