Каков наилучший метод для обновления всех измененных данных в EF 4? - PullRequest
1 голос
/ 21 марта 2010

Я пытаюсь создать какой-либо метод, который может обновлять любые измененные данные из измененного объекта данных (этот объект создается ASP.NET MVC) до старого объекта данных (этот объект извлекается из текущих данных в СУБД), например, следующий код.

public static bool UpdateSomeData(SomeEntities context, SomeModelType changedData)
{
    var oldData = GetSomeModelTypeById(context, changedData.ID);

    UpdateModel(oldData, changedData);

    return context.SaveChanges() > 0;
}

Я пытаюсь создать метод для сохранения любых измененных данных без влияния на другие неизмененные данные, такие как следующий исходный код.

public static void UpdateModel<TModel>(TModel oldData, TModel changedData)
{
    foreach (var pi in typeof(TModel).GetProperties()
        .Where
        (
            // Ignore Change ID property for security reason
            x => x.Name.ToUpper() != "ID" &&
            x.CanRead && 
            x.CanWrite && 
            (
                // It must be primitive type or Guid
                x.PropertyType.FullName.StartsWith("System") &&
                !x.PropertyType.FullName.StartsWith("System.Collection") &&
                !x.PropertyType.FullName.StartsWith("System.Data.Entity.DynamicProxies")
            )
        )
    {
        var oldValue = pi.GetValue(oldData, null);
        var newValue = pi.GetValue(changedData, null);

        if (!oldValue.Equals(newValue))
        {
            pi.SetValue(oldData, newValue, null);
        }
    }
}

Я не уверен в вышеуказанном методе, потому что это очень уродливый метод обновления данных. Из недавней ошибки я понял, что если вы обновите какое-либо свойство, такое как Свойства навигации (связанные данные из другой таблицы), оно удалит текущую запись из базы данных. Я не понимаю, почему это произошло. Но это очень опасно для меня.

Итак, есть ли у вас идеи по этому вопросу, чтобы убедиться, что я обновляю данные из ASP.NET MVC?

Спасибо

1 Ответ

0 голосов
/ 22 марта 2010

Вы рассматривали возможность использования такого инструмента, как Automapper ? Вы можете сопоставить тип сущности с самим собой, и вам будет предложено автоматически скопировать все поля для вас. На самом деле, я бы предпочел, чтобы вы использовали модель представления в MVC вместо того, чтобы разрешать редактирование непосредственно вашим сущностям, но это личное предпочтение.

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