EF Core 在断开连接的情况下设置原始值

旋耕者

我正在使用DBContext.Update(ParentEntity)更新实体。然后我遍历每个实体property.CurrentValueproperty.OriginalValue我面临的问题是CurrentValuesOriginalValues是相同的,即使一个属性已更改并且与数据库不同。我期待从数据库中获取OriginalValues这是在保存更改之前发生的循环。

foreach (var entry in ChangeTracker.Entries())
        {
            if (entry.Entity is Audit || entry.State == EntityState.Detached || entry.State == EntityState.Unchanged ||entry.Entity is ChangelogUser)
                continue;

            var auditEntry = new AuditEntry(entry) {TableName = entry.Metadata.Relational().TableName};
            auditEntries.Add(auditEntry);

            foreach (var property in entry.Properties)
            {
                if (property.IsTemporary)
                {
                    // value will be generated by the database, get the value after saving
                    auditEntry.TemporaryProperties.Add(property);
                    continue;
                }

                string propertyName = property.Metadata.Name;
                if (property.Metadata.IsPrimaryKey())
                {
                    auditEntry.KeyValues[propertyName] = property.CurrentValue;
                    continue;
                }

                switch (entry.State)
                {
                    case EntityState.Added:
                        auditEntry.NewValues[propertyName] = property.CurrentValue;
                        break;

                    case EntityState.Deleted:
                        auditEntry.OldValues[propertyName] = property.OriginalValue;
                        break;

                    case EntityState.Modified:
                        if (property.CurrentValue != null)
                        {
                            if (property.OriginalValue != null && property.CurrentValue != null)
                            {
                                if (property.IsModified && !property.CurrentValue.Equals(property.OriginalValue))
                                {
                                    auditEntry.OldValues[propertyName] = property.OriginalValue;
                                    auditEntry.NewValues[propertyName] = property.CurrentValue;
                                }
                            }
                        }

                        break;
                }
            }

从这段代码中,我 AWLAYS 获得了相同的 Original 和 Current 值。有没有办法从数据库中获取原始值并将它们设置在实体上?

旋耕者

由于很难获得 EFCore 问题的答案,这是我想出的解决方案。

查看State.Modified部分。我遍历每个实体,然后遍历每个属性。在这种情况下,我使用当前值和原始值来比较它们,并且仅在发生变化时才将它们添加到我的审计表中。

在该方法结束时,我从审计表中删除了未更改的实体。简单的表情包。

您可以使用此var databaseValues = entry.GetDatabaseValues();To 来满足您的自定义断开连接方案需求。

var auditEntries = new List<AuditEntry>();
        foreach (var entry in ChangeTracker.Entries())
        {

            if (entry.Entity is Audit || entry.State == EntityState.Detached || entry.State == EntityState.Unchanged)
                continue;

            var auditEntry = new AuditEntry(entry) {TableName = entry.Metadata.Relational().TableName};
            auditEntries.Add(auditEntry);

            var databaseValues = entry.GetDatabaseValues();

            foreach (var property in entry.Properties)
            {
                if (property.IsTemporary)
                {
                    // value will be generated by the database, get the value after saving
                    auditEntry.TemporaryProperties.Add(property);
                    continue;
                }

                string propertyName = property.Metadata.Name;
                if (property.Metadata.IsPrimaryKey())
                {
                    auditEntry.KeyValues[propertyName] = property.CurrentValue;
                    continue;
                }

                switch (entry.State)
                {
                    case EntityState.Added:
                        auditEntry.NewValues[propertyName] = property.CurrentValue;
                        break;

                    case EntityState.Deleted:
                        auditEntry.OldValues[propertyName] = property.OriginalValue;
                        break;

                    case EntityState.Modified:
                        if (property.CurrentValue != null)
                        {
                            if (databaseValues[propertyName] != null && property.CurrentValue != null)
                            {
                                if (property.IsModified && !property.CurrentValue.Equals(databaseValues[propertyName]))
                                {
                                    auditEntry.OldValues[propertyName] = databaseValues[propertyName];
                                    auditEntry.NewValues[propertyName] = property.CurrentValue;
                                }
                            }
                        }

                        break;
                }
            }

            if (auditEntry.NewValues.Equals(auditEntry.OldValues) || auditEntry.NewValues.Count == 0 && auditEntry.OldValues.Count == 0)
            {
                auditEntries.Remove(auditEntry);
            }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF Core错误的连接语句

来自分类Dev

带Like子句的EF Core原始查询

来自分类Dev

EF Core连接结果的通用类型类

来自分类Dev

EF CORE 数据注释和连接

来自分类Dev

EF Core MySql不显示枚举值

来自分类Dev

EF Core从方法而不是属性保存值

来自分类Dev

EF Core 3.1值转换器

来自分类Dev

如何从EF Core的FromSqlRaw获取空间值

来自分类Dev

EF Core审核级联删除的值

来自分类Dev

EF Core:“更新”列仅适用于断开连接的实体的修改属性

来自分类Dev

EF Core - 一次性 DbContext 和 Attach() - 或 - DbContext 作为成员 - 或 - 断开连接的实体

来自分类Dev

EF core 3.1无法运行复杂的原始SQL查询

来自分类Dev

EF Core 在设置关系时设置为 null

来自分类Dev

EF Core和Azure

来自分类Dev

EF Core执行SQL

来自分类Dev

EF Core中的IsNumeric

来自分类Dev

EF Core包含查询

来自分类Dev

编码MySql EF Core

来自分类Dev

更新 ContextModelSnapshot EF Core

来自分类Dev

在 ef core 2 中处理连接的最佳方法是什么

来自分类Dev

EF Core 在使用连接查询后包含子项

来自分类Dev

EF Core 3.1属性值返回默认字段值

来自分类Dev

在EF Core上下文上设置UseDatabaseNullSemantics = true

来自分类Dev

为什么 EF Core 2.0 似乎生成了错误的值?

来自分类Dev

EF 2.1 Core IEntityTypeConfiguration 添加默认值

来自分类Dev

使用 EF Core 和 Npgsql 查询行(复合)值

来自分类Dev

从 EF Core 中的子实体获取最大值

来自分类Dev

试图了解为什么在这种情况下会发生EF Core InvalidOperationException

来自分类Dev

如何在 EF Core / Dotnet Core 中进行查询而不使用连接