Вопрос

Хочу написать общий код аудита для моего подкласса DbContext.

foreach (var entry in this.ChangeTracker.Entries<MyClass>())
{
    if (entry.State == EntityState.Modified)
    {
        var entityProperties = entry.Entity.GetType().GetProperties();
        foreach (var entityProperty in entityProperties)
        {
            DbMemberEntry propertyEntry = entry.Member(property.Name);
            if (propertyEntry is DbPropertyEntry)
            {
                // IsModified available
            }
            else if (propertyEntry is DbReferenceEntry)
            {
                // IsModified not available
            }
        }
    }
}

1) Если я изменяю только ссылочное свойство, значение entry.State остается "Неизменным".

2) Даже если для пункта 1 было установлено значение "Изменено", класс DbReferenceEntry, похоже, не имеет ни свойства IsModified, ни исходного значения.

Я предполагаю, что это возможно, потому что EF, должно быть, отслеживает это.

Кто-нибудь может помочь?

Спасибо, Бен

Это было полезно?

Решение

Да, ссылочная запись (свойство навигации) не отслеживает изменения.За это отвечает свойство внешнего ключа (в случае ассоциации с внешним ключом) или отдельный объект, отслеживающий изменения независимой ассоциации.В ObjectContext API вы можете получить эти объекты с помощью ObjectStateManager но, похоже, в DbContext API это недоступно.Я задал вопрос по этому поводу на Форум MSDN.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top