使用反射更新数据库中的许多字段

时间:2011-07-22 23:04:03

标签: linq linq-to-sql reflection

我刚刚发现LINQ并发现它很棒。一个问题是,我必须在3层(层)应用程序的更新期间复制大量字段。我使用的算法显示了类的典型LINQ更新。

  1. 我从表示层收到对象FromPresentation
  2. 我使用LINQ从数据库中获取具有相同ID的对象。
  3. 我改变了很多字段
  4. 保存更改。
  5. 以及相应的代码:

    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对象,以便可以在数据库中更新?

2 个答案:

答案 0 :(得分:4)

不要使用反射,这将重新发明轮子 - 使用像AutoMapper这样的映射器为你完成工作。

  

AutoMapper使用流畅的配置API来定义对象对象   映射策略。 AutoMapper使用基于约定的匹配   用于匹配源到目标值的算法。目前,   AutoMapper面向模型投影场景以展平   复杂的对象模型,以DTO和其他简单的对象,其设计   更适合序列化,通信,消息传递或   只是域和应用程序之间的反腐败层   层

答案 1 :(得分: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);      
 }