Я пишу контрольный журнал из фрагментов кода, найденного в Интернете. При вызове моей функции SaveChanges я перебираю все измененные сущности, зарегистрированные в Context, и строю записи в журнале по их изменениям.
foreach (DbEntityEntry modifiedEntity in this.ChangeTracker.Entries().Where(p => p.State == System.Data.EntityState.Added || p.State == System.Data.EntityState.Deleted || p.State == System.Data.EntityState.Modified))
{
// For each changed record, get the audit record entries and add them
foreach(AuditLog x in GetAuditRecordsForChange(modifiedEntity, userId))
{
this.AuditLog.Add(x);
}
}
Когда я затем пытаюсь получить доступ к исходным значениям модифицированного объекта, все скалярные свойства заполняются, но сложные свойства не существуют (количество свойств будет, скажем, 6 вместо 8). Затем я вызываю ToObject()
, чтобы построить объект в его первоначальном состоянии, но очевидно, что все сложные свойства имеют значение null.
modifiedEntity.OriginalValues.ToObject()
Это происходит только с некоторыми объектами моего домена, и эти объекты всегда отображаются как прокси после вызова ToObject()
, тогда как (я не уверен почему), но те, у которых нет прокси созданные для них сущности, их сложные свойства заполняются прекрасно. Когда я использую прокси-серверы POCO, как обычно, во всех приложениях, отложенная загрузка работает нормально.
Я заметил, что если я внесу изменение в одно из этих сложных свойств, которые не заполняются как часть данных OriginalValues, состояние объекта не изменится на Изменено, это имеет смысл, так как отслеживание изменений сравнивает оригинал значения к текущему, чтобы увидеть, если он изменился. Что не имеет смысл, так это то, что данные все еще сохраняются в SaveChanged ??
РЕДАКТИРОВАТЬ: Я только что заметил, объект модели, который делает заполняет свои сложные свойства, рассматриваемое комплексное свойство (по соглашению) рассматривается Entity как «сложный тип», т.е.
Есть идеи?