使用通用存储库但仅某些字段的实体框架核心更新

时间:2019-08-17 01:26:30

标签: c# sql performance asp.net-core entity-framework-core

我看到的每个通用存储库都是这样

    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;

这解决了问题

0 个答案:

没有答案