Как вы заявили позже, вы использовали генератор POCO, а не генератор самосопровождаемых объектов.
Я тоже это попробовал и очень озадачился. Кажется, что прокси-классы работают не совсем так, как ожидалось, и может быть ошибка. Тогда снова. ни один из примеров на MSDN не пробует что-то подобное, и когда они ссылаются на обновления на разных уровнях приложения (что-то вроде того, что мы делаем здесь), они используют объекты самоконтроля, а не прокси POCO.
Я не уверен, как работают эти прокси, но они, похоже, хранят какое-то состояние (мне удалось найти состояние "Modified" внутри частных свойств). Но, похоже, это свойство ПОЛНОСТЬЮ игнорируется. Когда вы присоединяете свойство к контексту, контекст добавляет запись в ObjectStateManager и сохраняет там новые обновления состояния. На данный момент, если вы сделаете изменение - оно будет зарегистрировано и применено.
Проблема в том, что при подключении сущности - измененное состояние от прокси-сервера не передается менеджеру состояния в контексте. Кроме того, если вы используете context.Refresh (), обновления переопределяются и забываются! Даже если вы передадите в него RefreshMode.ClientWins. Я попытался установить для свойства состояния состояния объекта значение «Изменено», но оно все равно было переопределено, и исходные параметры были восстановлены.
Похоже, что ошибка в EF не права, и единственный способ сделать это - использовать что-то вроде этого:
using (var db = new Entities())
{
var newUser = (from u in db.Users
where u.Id == user.Id
select u).SingleOrDefault();
db.Users.ApplyCurrentValues(user);
db.SaveChanges();
}
Еще одна вещь здесь
Entitity Framework: отслеживание изменений в SOA с подходом POCO
Похоже, что POCO просто не поддерживает подход, который вы ищете, и, как я ожидал, сущности с самообследованием были созданы для решения ситуации, которую вы тестировали, в то время как прокси-серверы POCO отслеживают изменения только в созданном ими контексте. .. Или так кажется ...