在asp.net核心应用程序的EF核心中更新数据的最佳方法是什么? 我可以这样做
public class Repository<T> : IRepository<T> where T : BaseEntity
{
private DbContext context;
private DbSet<T> entities;
public Repository(DbContext context)
{
this.context = context;
this.entities = context.Set<T>();
}
public void Update(T entity)
{
T exist = this.entities.Find(entity.Id);
this.context.Entry(exist).CurrentValues.SetValues(entity);
this.context.SaveChanges();
}
}
或者我可以使用DbSet的Update()方法。但是要使用它,我需要首先将QueryTrackingBehavior设置为“ no-tracking”,如下所示:
public class Repository<T> : IRepository<T> where T : BaseEntity
{
private DbContext context;
private DbSet<T> entities;
public Repository(DbContext context)
{
this.context = context;
this.context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
this.entities = context.Set<T>();
}
public void Update(T entity)
{
this.entities.Update(entity);
this.context.SaveChanges();
}
}
这是个好主意吗?哪种选择更好,为什么呢?
答案 0 :(得分:1)
SetValues仅会将与跟踪的实体具有不同值的属性标记为已修改。这意味着发送更新时,仅那些实际更改的列将被更新。 (如果没有任何变化,那么将不会发送任何更新。)
所以我认为您的第一种方法(this.context.Entry(exist).CurrentValues.SetValues(entity);
)
应该是更新实体的最佳选择!