繁体   English   中英

如何在Entity Framework Core中更新修改的列?

[英]How to update modified columns in 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:'无法强制转换类型为System.Func'2 [Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Int32]的对象,类型为'System.Func`2 [Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry ,System.Object的] ''

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

任何帮助将非常感激。

谢谢

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

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

最好的建议是首先从DBContext中获取实体,然后使用诸如automapper之类的方法将传入的实体的属性映射到检索到的模型,然后调用DbContext.SaveChanges(),这将仅更新在此过程中已更改的属性。地图。 自动映射器将仅处理两面都存在的映射属性,如果需要更精细的控制,则可以配置映射。

伪代码如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM