使用LINQ更新SQL行中的每个字段而不特别声明每个字段?

时间:2016-08-19 21:26:52

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

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

我尝试做的是:

  1. 将更新的模型对象传递给方法。
  2. 根据模型对象的ID
  3. 从db上下文中获取DTO对象
  4. 如果不为null,则使用AutoMapper将模型对象转换为DTO对象
  5. 现在将原始DTO对象设置为新映射的DTO对象
  6. 更新数据库(这是失败的地方
  7. 保存上下文
  8. 但是如果我明确地将每个DTO字段=设置为其对应的模型字段,那么它(显然)可以工作。但是由于频繁的数据库更改以及大量的SQL字段,我希望避免手动更新每个字段并在每次更改数据库时都进行维护。

3 个答案:

答案 0 :(得分:2)

如果您使用最新版本的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();
}

答案 1 :(得分:1)

您可以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

答案 2 :(得分:0)

感谢所有回复。以下是使用最新版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();
    }
}