2011-07-22 39 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);  
} 
相关问题