2010-08-06 40 views
1

我有以下代碼更新從強類型視圖返回的JobCard對象。但是,使用JobCard實體調用GetModifiedMembers將返回JobCard的每個屬性,其中CurrentValueOriginalValue都設置爲當前值。將LINQ中的更改合併到SQL實體

public int Update(BusinessObjects.JobCard model) 
    { 
     Poynting.Installation.DataObjects.LinqToSql.JobCard entity = JobCardMapper.ToEntity(model); 
     using (Database db = DataContextFactory.CreateContext()) 
     { 
      try 
      { 
       //LinqToSql.JobCard origJobCard = db.JobCards.Single(jc => jc.JobID == model.InstallationDBNumber); 
       db.JobCards.Attach(entity, true); 
       db.SubmitChanges(); 

我懷疑這是因爲我們使用Attach,而不是實際更新的附加實體。由於此更新由HttpPost操作方法調用,因此我們無法保留附加的實體。我猜測如果我不附加傳入的實體,而是使用它的值來更新附加的JobCard實體(從註釋掉的行開始),我的審計服務將檢測到正確的更改。

我在這裏的主要問題是:我必須遍歷entity的每個屬性並在origJobCard上設置相應的屬性,或者是否有某種合併操作可用於某處?

回答

0

我想你已經正確識別你的選擇在這裏,除了也許有,這可能會或可能不會有吸引力:與HTTP操作中被序列化(分離)的原始實體一起,你可以發送一個乾淨的副本/同一實體的克隆將保持不變,當http操作完成時,您會將髒和乾淨的分離實體傳遞給Attach(TEntity, TEntity)方法。

循環訪問屬性並將值從分離的實體複製到附屬實體(如您所建議的)實際上可能會少一些工作(但效率不高,除非您在某處緩存columnProperties並避免一遍又一遍地執行搜索) 。

這裏的循環方法的一個例子:

List<PropertyInfo> columnProperties = typeof(Employee).GetProperties() 
    .Where(p => p.GetCustomAttributes(typeof(ColumnAttribute), true).Any()) 
    .ToList(); 

Employee employee1 = new Employee() { VacationHours = 100 }; 
Employee employee2 = new Employee() { VacationHours = 10 }; 

foreach (PropertyInfo pi in columnProperties) 
{ 
    object value = pi.GetValue(employee1, null); 
    pi.SetValue(employee2, value, null); 
} 

正如你所看到的,因爲你的問題已經快半年的時候,我主要是做這行的編碼/應答實踐。乾杯!

[編輯]

Automapper可能是另一種選擇。或Automapper加上專用的視圖對象,如this answer and discussion