【问题标题】:Using LINQ to update every field in SQL row without specifically declaring each field?使用 LINQ 更新 SQL 行中的每个字段而不具体声明每个字段?
【发布时间】:2016-08-19 21:26:52
【问题描述】:

我只是想知道是否有一种方法可以更新 SQL 行中的每个字段/属性,而无需为每个字段声明显式的“context.FieldName = model.FieldName”。

我尝试做的是:

  1. 将更新后的模型对象传递给方法。
  2. 根据模型对象的 ID 从 db 上下文中获取 DTO 对象
  3. 如果不为 null,则使用 AutoMapper 将模型对象转换为 DTO 对象
  4. 现在将原始 DTO 对象设置为新映射的 DTO 对象
  5. 更新数据库(这是失败的地方
  6. 保存上下文

但是,如果我将每个 DTO 字段 = 明确设置为其相应的模型字段,它就可以工作(显然)。但是由于频繁的数据库更改,以及大量的 SQL 字段,我希望避免在每次数据库更改时手动更新每个字段并维护它。

【问题讨论】:

  • 您可以将模型对象映射到数据传输对象,然后将此对象附加到上下文中,处于已修改状态:dbContext.Entry(dto).State = EntityState.Modified;

标签: c# asp.net sql-server linq asp.net-core


【解决方案1】:

如果你使用最新版本的 automapper,你可以这样做:

public void UpdateCustomer(Customer customer)
{
    var customerTopdate=dbContext.Customers.Where(c=>c.Id=customer.Id);
    var result=AutoMapper.Map<Customer>(customer,customerTopdate);
    dbContext.SaveChanges();
}

【讨论】:

  • 谢谢,这是迄今为止最简单的解决方案。我更新了我的 AutoMapper,它完美地工作。但是,您的代码中唯一的错误是“var result=AutoMapper.Map(customer,customerTopdate);”应该是“var result=AutoMapper.Map(customer,customerTopdate);”。
  • @AnthonyMascia 公平地说,他没有错。他只是明确声明了 Map 方法的返回类型。
【解决方案2】:

您可以将Entity State 用于您的entity 用于update 以及deleteinsert..

更新

dbContext.Entry(yourEntity).State = EntityState.Modified;
dbContext.SaveChanges(); 

插入

dbContext.Entry(yourEntity).State = EntityState.Added;
dbContext.SaveChanges(); 

删除

dbContext.Entry(yourEntity).State = EntityState.Deleted;
dbContext.SaveChanges(); 

并且不要忘记在每次操作结束时调用SaveChanges()

欲了解更多信息,请访问

Entity states and SaveChanges

【讨论】:

    【解决方案3】:

    感谢所有回复。这是我使用最新版本的 AutoMapper 使其工作的方法:

    public void UpdateCustomer(Customer customer)
    {
        var customerTopdate=dbContext.Customers.Where(c=>c.Id=customer.Id);
    
        if (customerTopdate != null {
           _mapper.Map(customer,customerTopdate);
           _context.SaveChanges();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2012-02-20
      • 2020-12-29
      相关资源
      最近更新 更多