【发布时间】: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