2013-04-28 48 views
4

我在實體更新時遇到以下問題。下面給出的是我的WCF方法。 (更新是由公共Save方法確定後調用它是否更新或補充)實體框架實體狀態在沒有任何修改的情況下被修改

protected bool UpdateSalesMaster(SalesMaster order) 
{ 
    using (var context = new MyContext()) 
    { 
     SalesMaster original = context.SalesMasters.FirstOrDefault(o => o.OrderID == order.OrderID); 

     if (original != null) 
     { 
      context.Entry(original).CurrentValues.SetValues(order); 

      foreach (SalesDetail detail in order.SalesDetails) 
      { 
       if (detail.OrderDetailID == 0) 
        context.SalesDetails.Add(detail); 
       else 
       { 
        SalesDetails originalDetail = context.SalesDetails.FirstOrDefault(o => o.OrderDetailID == detail.OrderDetailID); 
        if (originalDetail != null) 
         context.Entry(originalDetail).CurrentValues.SetValues(detail); 
       } 
      } 

      context.SaveChanges(); 
      return true; 
     } 
     else 
     { 
      throw new FaultException(string.Format("Invalid Order specified: {0}", order.OrderID)); 
     } 
    } 
} 

當我剛剛更新SalesMaster訂購日期和不改變任何細節,更新查詢被激發到數據庫爲細節。我預計只會看到更新查詢SalesMaster。

有人可以讓我知道我在這裏做錯了什麼嗎?如果沒有更改,我不想將更新查詢發送到數據庫。我使用從數據庫中獲取原始值的方法來確定是否使用context.Entry(originalDetail).CurrentValues.SetValues(detail)更新了任何值。

我還通過檢查實體的IAuditable實現來覆蓋SaveChanges以設置LastModified日期。這是當我發現細節實體的狀態被識別爲已修改的時候。但是在數據庫中發生的唯一更新是LastModifiedBy,它在我的保存更改中進行了更新。我不確定在沒有任何細節變化時它是如何設置爲Modified狀態的。

public override int SaveChanges() 
{ 
    var changeSet = ChangeTracker.Entries<IAuditable>(); 

    if (changeSet != null) 
    { 
     foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged)) 
     { 
      if (entry.State == EntityState.Added) 
       entry.Entity.DateCreated = DateTime.Now; 

      if (entry.State == EntityState.Modified) 
      { 
       entry.Property(a => a.CreatedByUser).IsModified = false; 
       entry.Property(a => a.DateCreated).IsModified = false; 
      } 
      entry.Entity.DateModified = DateTime.Now; 
     } 
    } 
    try 
    { 
     return base.SaveChanges(); 
    } 
    catch (DbEntityValidationException ex) 
    { 
     throw ex; 
    } 

} 

我的解決方案的結構是:

  1. 客戶端 - Windows窗體UI
  2. 實體 - POCO作爲單獨的庫
  3. WCF - 所有的業務邏輯,添加,更新,刪除的對象。使用Fluent映射的數據 - 實體框架上下文。
+0

IAuditable是否包含分離對象的修改狀態?你檢查過這些對象的狀態嗎? AFAIK沒有級聯更新,所有事情都需要明確地完成。 – brumScouse 2014-04-28 22:41:45

回答

0

根據您設置POCO的方式,EF將默認使用兩種方法之一來檢查實體上的更改。

如果所有POCO屬性都是虛擬的,EF將使用繼承POCO類型的代理對象,並覆蓋所有屬性以跟蹤更改。

我假設在這種情況下,在整個對象上使用SetValues將觸發髒標誌,這將導致EF生成對數據庫的更新查詢。

如果您不使用代理服務器,brumScouse建議您的不可觸發的實施將是主要的嫌疑人。

相關問題