2016-08-19 52 views
2

我只是想知道是否有辦法更新SQL行中的每個字段/屬性,而無需爲每個字段聲明顯式的「context.FieldName = model.FieldName」。使用LINQ來更新SQL行中的每個字段而不明確聲明每個字段?

我想這樣做是:

  1. 通行證在更新的模型對象的方法。
  2. 從DB背景下基於模型對象的ID的DTO對象
  3. 如果不爲空,使用AutoMapper,轉換模型對象中的DTO對象
  4. 現在設置的原始DTO對象到新映射DTO反對
  5. 更新數據庫(這是它失敗
  6. 保存上下文

但如果我明確地設置每一個DTO場=其相應的模型場,它工作(顯然)。但由於頻繁的數據庫更改以及大量的SQL字段,我希望避免手動更新每個字段並在每次更改數據庫時對其進行維護。

+0

您可以直接映射模型對象數據傳輸對象,然後調用這個對象追加到的背景下,*修改*狀態:'dbContext.Entry (dto).State = EntityState.Modified;' –

回答

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(); 
} 
+0

謝謝你,這是迄今爲止最簡單的解決方案。我更新了我的AutoMapper,它的工作完美無瑕。然而,你的代碼唯一錯誤的是「var result = AutoMapper.Map (customer,customerTopdate);」應該是「var result = AutoMapper.Map(customer,customerTopdate);」。 – Daath

+0

@AnthonyMascia公平,他沒有錯。他只是明確聲明瞭Map方法的返回類型。 – Don

1

您可以使用Entity Stateentityupdate以及爲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

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(); 
    } 
}