我看到的每个通用存储库都是这样
public async Task UpdateAsync<T>(T entity) where T : class
{
this.dbContext.Set<T>().Update(entity);
_ = await this.dbContext.SaveChangesAsync();
}
问题是如果我有一个超过50列的实体,我不确定这是否是一个好方法。
这是更新与附加时由EF Core生成的sql的快速示例
var reference = _context.References.Find(1);
reference.Name= "123456";
_context.References.Update(reference);
_context.SaveChanges();
_context.References.Attach(reference);
_context.Entry(reference).Property(r => r.Name).IsModified = true;
_context.SaveChanges();
这是用于更新命令的sql
SET NOCOUNT ON;
UPDATE [Production].[References] SET [IsDeleted] = @p0, [Name] = @p1
WHERE [Id] = @p2;
SELECT @@ROWCOUNT;
并附加
SET NOCOUNT ON;
UPDATE [Production].[References] SET [Name] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
是否只更新wholy实体并标记特定属性为已修改有关系吗?由于只有第一种方法可在通用存储库上使用。
更新
好的,我找到了一种解决方法。似乎是按照
更新实体的最佳方法https://entityframeworkcore.com/knowledge-base/54169736/what-is-better-way-to-update-data-in-ef-core
正在使用
_context.Entry(exist).CurrentValues.SetValues(entity);
SetValues仅将具有以下内容的属性标记为已修改 与被跟踪实体中的值不同。这意味着 发送更新后,只有那些实际更改的列会 被更新。 (如果没有任何更改,则不会发送任何更新 完全没有。)
并且EF Core使用我的示例生成的查询与第二个查询完全相同
SET NOCOUNT ON;
UPDATE [Production].[References] SET [Name] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
这解决了问题