Изменения LINQ, не распознаваемые при использовании обобщенных элементов - PullRequest
0 голосов
/ 28 апреля 2011

В настоящее время я пытаюсь создать класс, который использует дженерики, чтобы уменьшить объем работы, необходимой для будущей разработки. Когда я добавляю таблицы в конструктор LINQ To SQL, в каждом из них используются определенные базовые методы. Вместо того, чтобы воспроизводить их в каждом Частичном классе, связанном с каждой новой таблицей, я хотел бы использовать один общий класс. Проблема заключается в том, что любые изменения, внесенные в Предприятия, не признаются и, следовательно, не передаются.

Public Partial Class ABC
{
  Public Static Bool Synchronize(string source, string destination)
  {
    try
    {
      DataContext destinationDB = DataConnection.Destination(destination);
      Table<ABC> destinationABCs = destinationDB.ABCs;

      DataContext sourceDB = DataConnection.Destination(source)
      Table<ABC> sourceABCs = sourceDB.ABCs;

      foreach (ABC ABCCode in sourceABCs)
      {
        ABC destABCCode = destinationABCs.SingleOrDefault(x => x.Id == ABCCode.Id);

        bool same = EntityProcessing.AreIdentical(ABCCode, destABCCode);

        if (same == false)
        {
          destABCCode = (ABC)EntityProcessing.Synchronize(ABCCode, destABCCode);
        }
      }
      ChangeSet test = destinationDB.GetChangeSet();  // Test Line For Debugging
      destinationDB.SubmitChanges();
    }
    return true;
  }
}

Следующий класс:

Public Static Class EntityProcessing
{
  Public Static Bool AreIdentical(Object sourceEntity, Object destinationEntity)
  {
     if (sourceEntity.GetType() == destinationEntity.GetType())
     {
       Type t = sourceEntity.GetType();
       FieldInfo[] tList = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

       foreach (FieldInfo fi in tList)
       {
         if ((fi.GetValue(sourceEntity) != null ? fi.GetValue(sourceEntity).ToString()
            : null) == (fi.GetValue(destinationEntity) != null ?
            fi.GetValue(destinationEntity).ToString() : null))
         { continue; }
         else
         { return false; }
       }
       return true;
     }
     else
     { return false; }
  }

  Public Static Object Synchronize(Object sourceEntity, Object destinationEntity)
  {
    if (sourceEntity.GetType() == destinationEntity.GetType())
    {
      Type t = sourceEntity.GetType();
      FieldInfo[] tList = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

      foreach (FieldInfo fi in tList)
      {
        fi.SetValue(destinationEntity, fi.GetValue(sourceEntity));
      }
    }
    return destinationEntity;
  }
}

Я также пытался изменить метод EntityProcessing.Synchronize в метод Void. Ни то, ни другое не работает. Оба вернут правильный Entity с полями, установленными на соответствующие результаты. Проблема заключается в том, что LINQ не распознает сущности как измененные.

Если я добавлю временную строку ChangeSet test = destinationDB.GetChangeSet();, счетчик обновлений будет равен нулю. Похоже, что потеря в преобразовании в объекты.

Я попытался установить тип параметра на ABC в методе EntityProcessing.Synchronize() и изменить поле, и счетчик обновлений в test правильный. Как мне решить это?

Как передать обновленные сущности в базу данных, или, вернее, как заставить LINQ распознать, что эти сущности изменены и нуждаются в обновлении?

1 Ответ

0 голосов
/ 28 апреля 2011

Вы имеете в виду: Public Static Bool Synchronize<ABC>(string source, string destination) с "ABC" в качестве универсального типа?

Однако я не думаю, что ваш .ABCs сработает так просто. Возможно, вам придется использовать рефлексию, чтобы добраться до объекта с таким конкретным именем. Например, сначала используйте отражение, чтобы получить имя параметра типа (ABC), а затем используйте отражение, чтобы получить поле таблицы из источника данных на основе этого имени типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...