【问题标题】:How to update modified columns in Entity Framework Core?如何更新 Entity Framework Core 中的修改列?
【发布时间】:2017-07-26 20:11:47
【问题描述】:

我一直在使用 ASP.NET Core 构建 API 并使用 EF Core 进行数据访问。在 Stackoverflow 和 Google 上冲浪时,我找不到使用存储库模式仅更新已修改列的方法。

有什么方法可以检查值是否发生了变化?

public virtual void Update(T entity)
{
       // DbContext.Attach(entity);
        var dbEntityEntry = DbContext.Entry(entity);

        foreach (var property in dbEntityEntry.Properties)
        {
            var original = dbEntityEntry.OriginalValues.GetValue<object>(property.Metadata.Name);
            var current = dbEntityEntry.CurrentValues.GetValue<object>(property.Metadata.Name);

            if (original != null && !original.Equals(current))
                dbEntityEntry.Property(property.Metadata.Name).IsModified = true;
        }
}

我尝试像 EF 6 一样实现,但它抛出了 InvalidCastException

System.InvalidCastException: '无法转换类型的对象 System.Func'2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Int32]' 键入'System.Func`2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Object]'。'

我直接将从客户端接收到的对象更新到动作控制器并更新它。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 你为什么认为你必须自己做呢?您是否在分析器中捕获了 UPDATE 查询并注意到所有字段都存在于 SET 子句中,即使是未更改的字段?
  • 是的,我已经使用 Sql Express Profiler 进行了检查,在发送整个对象时,即使它们的值未更改,它们也会在 UPDATE 语句中设置。如果我不发送 json object 中的属性,它会抛出 ValidationEntityResult.
  • 有人遇到过这个问题吗?

标签: c# asp.net entity-framework asp.net-core entity-framework-core


【解决方案1】:

如果您传入的原始 T 实体最初不是从 dbContext 中检索到的,则不会跟踪该实体,因此 EF 本身将无法跟踪哪些属性已更改。

同时调用 dbContext.Update 将实体上的所有属性标记为脏。

最好的建议是首先从 DBContext 中获取实体,然后使用 automapper 之类的东西将传入实体的属性映射到您检索到的模型,然后调用 DbContext.SaveChanges() 这将只更新那些在地图期间发生了变化。 Automapper 将只处理双方都存在的映射属性,如果您需要更细粒度的控制,您可以配置映射。

下面的伪代码:

public virtual void Update(T entity)
{
       var existingEntity = DbContext.Entity.First(x => x.Id == entity.Id);
       autoMapper.Map(entity, existingEntity);
       DbContext.SaveChanges();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多