2011-07-22 40 views
0

我只是發現LINQ並發現它很棒。一個問題是,我必須在3層(層)應用程序的更新期間複製大量字段。我使用的算法顯示了一個類的典型LINQ更新。使用反射更新數據庫中的許多字段

  1. 我從表示層收到對象FromPresentation
  2. 我使用LINQ從數據庫中獲取具有相同ID的對象。
  3. 我改變了很多字段
  4. 保存更改。

而且相應的代碼:

using (var ctx = new AppDataDataContext()) 
{ 
    var OBJ = 
     (from Usu in ctx.usuarios 
     where Usu.ID == FromPresentation.ID 
     select Usu).SingleOrDefault(); 
    if (OBJ != null) 
    { 
     OBJ.Nome = FromPresentation.Nome; 
     OBJ.NomeCurto = FromPresentation.NomeCurto; 
     OBJ.Login = FromPresentation.Login; 
     OBJ.Senha = FromPresentation.Senha; 
     OBJ.SuperUsuario = FromPresentation.SuperUsuario; 
     OBJ.Ativo = FromPresentation.Ativo; 
      // a lot more fields     
     ctx.SubmitChanges(); 
     return OBJ.ID; 
    } 
} 

的問題是,我有很多領域。我甚至嘗試使用反射(using this question for guidance)來複制字段,但LINQ未被通知更改,因此它不保存任何內容。

如何使用反射將值複製到LINQ對象,以便可以在數據庫中進行更新?

+0

您的數據庫對象有一個主鍵聲明?使用反射應該可以工作(雖然你最好使用BrokenGlass提到的工具),但除非你聲明瞭主鍵,否則不會。沒有它,就不會生成代碼來在數據庫對象上進行更新。 –

+0

傑夫,我看不出如何使用Linq。 – Fabio

+1

請參閱:[LINQ不更新.SubmitChanges()](http://stackoverflow.com/questions/206532/linq-not-updating-on-submitchanges)。無論你使用反射還是像automapper這樣的工具,如果你的對象沒有聲明主鍵,那也無關緊要。 –

回答

4

不要爲此使用反射,這將重塑車輪 - 使用像AutoMapper這樣的映射器爲您完成工作。

AutoMapper使用流暢的配置API來定義對象對象 映射策略。 AutoMapper使用基於約定的匹配 算法將源與目標值進行匹配。目前, AutoMapper適用於模型預測場景,以將 複雜對象模型扁平化爲DTO和其他簡單對象,其設計 更適合於序列化,通信,消息傳遞或簡單地域和應用程序之間的防腐層 層。

+0

破碎的玻璃,剛剛嘗試了AutoMapper,它注意到有相同的問題反射。對象的屬性在對象上發生變化,但不知何故它不會通知Linq記錄已更改。我認爲這是因爲它直接改變了字段而不是屬性。 Linq需要我們使用這些屬性,以便通知某些事物發生了變化。 – Fabio

+0

好的,我定義了該類的部分方法之一,並且我可以告訴LINQ id在使用AutoMaper時正確地觸發事件,所以我的上述理論有缺陷。那麼,爲什麼當我使用反射或AutoMapper複製字段時LINQ不保存記錄? – Fabio

0

您可以嘗試更新屬性而不是字段。

private static void UpdateForType(Type type, MyObject source, MyObject destination) 
{ 
    var myObjectProperties = type.GetProperties(
     BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 

    foreach (PropertyInfo pi in myObjectProperties) 
     pi.SetValue(destination, pi.GetValue(source, null), null);  
} 
相關問題