c# - 如何更新 Entity Framework Core 中修改的列?

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

我一直在使用 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: 'Unable to cast object of type System.Func'2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Int32]' to type 'System.Func`2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Object]'.'

我直接将从客户端接收到的对象更新到操作 Controller 并更新它。

任何帮助将不胜感激。

谢谢

最佳答案

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

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

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

下面的伪代码:

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

关于c# - 如何更新 Entity Framework Core 中修改的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45336516/

相关文章:

c# - 如何通过C#代码检测是否安装了Crystal Reports Basic

c# - 如何使用 WebRequest 发布一些数据并读取响应?

linq - EF1.0 中的预加载

c# - OData 中实体的别名/重命名属性

c# - Entity Framework 通用存储库与上下文直接查询

c# - 对象数据库和 C#

C# 简单图像调整大小 : File Size Not Shrinking

c# - 将 C# 程序移动到不同的语言

javascript - ASP.NET MVC 在离开当前页面时放弃 session

c# - 获取唯一的线程 ID