2010-03-21 99 views
1

我嘗試創建一些方法,可以將更改後的Data對象(此對象由ASP.NET MVC生成)中的任何更改的數據更新爲舊數據對象(此對象從DBMS中的當前數據檢索),如下面的代碼。什麼是更新EF 4中所有更改數據的最佳方法?

public static bool UpdateSomeData(SomeEntities context, SomeModelType changedData) 
{ 
    var oldData = GetSomeModelTypeById(context, changedData.ID); 

    UpdateModel(oldData, changedData); 

    return context.SaveChanges() > 0; 
} 

我嘗試保存任何更改的數據,而不影響像下面的源代碼,其他不變數據創建方法。

public static void UpdateModel<TModel>(TModel oldData, TModel changedData) 
{ 
    foreach (var pi in typeof(TModel).GetProperties() 
     .Where 
     (
      // Ignore Change ID property for security reason 
      x => x.Name.ToUpper() != "ID" && 
      x.CanRead && 
      x.CanWrite && 
      (
       // It must be primitive type or Guid 
       x.PropertyType.FullName.StartsWith("System") && 
       !x.PropertyType.FullName.StartsWith("System.Collection") && 
       !x.PropertyType.FullName.StartsWith("System.Data.Entity.DynamicProxies") 
      ) 
     ) 
    { 
     var oldValue = pi.GetValue(oldData, null); 
     var newValue = pi.GetValue(changedData, null); 

     if (!oldValue.Equals(newValue)) 
     { 
      pi.SetValue(oldData, newValue, null); 
     } 
    } 
} 

我不確定上述方法,因爲它是如此醜陋的方法來更新數據。從最近的錯誤,它意識到如果你更新一些屬性,如導航屬性(從其他表的相關數據),它會從數據庫中刪除當前記錄。我不明白爲什麼發生。但這對我來說非常危險。

那麼,你有什麼想法這個問題,以確保我有關從ASP.NET MVC更新數據?

感謝,

回答

0

你有看着使用像​​的工具嗎?您可以將實體類型映射到自身,並讓automapper爲您複製所有字段。其實我寧願看到你在MVC中使用視圖模型,而不是直接對你的實體進行編輯,但這是個人偏好。

+0

我知道。有幾個用於映射的開源庫。但是,我認爲這對我來說太複雜了。 謝謝建議。 – 2010-03-22 08:56:15

相關問題