Обновление многих полей в базе данных с использованием отражения - PullRequest
0 голосов
/ 23 июля 2011

Я просто открываю LINQ и нахожу его великолепным. Одна из проблем заключается в том, что мне нужно скопировать много полей во время обновления в 3-уровневом (слойном) приложении. Алгоритм, который я использовал, показывает типичное обновление класса LINQ.

  1. Я получаю объект FromPresentation из уровня представления.
  2. Я использую LINQ для получения объекта с таким же идентификатором из базы данных.
  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;
    }
}

Проблема в том, что у меня много полей. Я даже пытался использовать отражение (, используя этот вопрос для руководства ), чтобы скопировать поля, но LINQ не уведомляется об изменениях, поэтому ничего не сохраняет.

Как использовать отражение для копирования значений в объект LINQ, чтобы его можно было обновлять в базе данных?

Ответы [ 2 ]

4 голосов
/ 23 июля 2011

Не используйте отражение для этого, это будет заново изобретать колесо - используйте картограф, такой как AutoMapper , чтобы сделать работу за вас.

AutoMapper использует свободную конфигурациюAPI для определения стратегии отображения объекта-объекта.AutoMapper использует основанный на соглашении алгоритм сопоставления для сопоставления значений источника и назначения.В настоящее время AutoMapper ориентирован на сценарии проецирования моделей для выравнивания сложных объектных моделей для DTO и других простых объектов, дизайн которых лучше подходит для сериализации, связи, обмена сообщениями или просто для защиты от коррупции между доменом и прикладным уровнем.

0 голосов
/ 23 июля 2011

Вы можете попробовать обновить свойства, а не поля.

например,

 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);      
 } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...