Если у вас включено автоматическое обнаружение изменений (по умолчанию в EF 4.1) Entry
вызывает DetectChanges
внутри. Метод начинается, вероятно, примерно так:
if (Configuration.AutoDetectChangesEnabled)
ChangeTracker.DetectChanges();
//...
Во втором вызове db.Entry(person)
объект изменился, и метод DetectChanges
обнаруживает это, сравнивая снимок, сделанный при загрузке объекта с текущими значениями. Поскольку существует разница, состояние изменяется с Unchanged
на Modified
.
Также State
объекта entry
, созданного вами до изменения, перейдет к Modified
, поскольку DbEntityEntry.State
, скорее всего, свойство, которое просто распространяет значение State
внутреннего _internalEntityEntry
, которое остается один и тот же экземпляр в обоих DbEntityEntry
объектах.
Если вы действительно хотите сохранить прежнее состояние объекта, вам нужно сохранить сам State
, а не только объект entry
:
var state = db.Entry(person).State;
Это просто перечисление и не изменится при последующем вызове Entry
.
Вы можете сравнить это поведение с поведением при отключении автоматического обнаружения изменений:
db.Configuration.AutoDetectChangesEnabled = false;
Обе sb.Append...
строки получат состояние Unchanged
в этом случае, потому что EF больше не замечает, что одно из ваших свойств POCO изменилось, потому что DetectChanges
не вызывается.