我一直在使用 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/