Реализация настраиваемого неотображенного свойства для сущностей - PullRequest
1 голос
/ 06 марта 2012

В настоящее время я разрабатываю приложение, объектная модель и уровень персистентности которого создаются с помощью конструктора моделей Entity Framework.

Одно из требований, которое у меня есть, - это предоставление статуса моим сущностям, который может сообщать мне всякий раз, когдаони находятся в «грязном» состоянии (измененном), когда происходит изменение статуса и, что наиболее важно, работают в отключенном режиме.Поэтому я начал изменять шаблон T4 для добавления логического свойства IsDirty при генерации этих сущностей, добавил событие, которое вызывается при каждом изменении IsDirty, и добавил this.IsDirty = true в методы xxxChanged всех скалярных свойств.

Все прекрасно работает, когда сущность не присоединена к своему контексту, но когда присоединена, когда свойство изменяется, изменяя значение IsDirty на false, я получаю это исключение:

Свойство IsDirty не имеет действительного сопоставления сущностей для объекта сущности.Для получения дополнительной информации см. Документацию Entity Framework.

Так что же я здесь не так делаю?Я не хочу, чтобы это свойство отображалось в моей базе данных, так как это просто состояние объекта, которое имеет значение только тогда, когда объект «жив».Есть ли атрибут, который я должен использовать для украшения свойства IsDirty?Или я должен получить EntityObject и реализовать механизм статуса?Или, может быть, у вас есть лучший совет, как это реализовать?

Спасибо.


Редактировать: я использую Entity Framework 4.0 с конструктором EDM.

Вотфрагмент кода, сгенерированный в каждой базовой сущности:

private bool isDirty;   
public event EventHandler DirtyStatusChanged;

public bool IsDirty
{
    get
    {
        return this.isDirty;
    }

    internal set
    {
        if (this.isDirty != value)
        {
            ReportPropertyChanging("IsDirty");
            this.isDirty = value;
            ReportPropertyChanged("IsDirty");
            ReportDirtyStatusChanged();
        }
    }
}

protected void ReportDirtyStatusChanged()
{
    var handler = this.DirtyStatusChanged;

    if(handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

1 Ответ

1 голос
/ 07 марта 2012

Я наконец-то нашел ошибку сам.Проблема заключалась в моём установщике свойств.Вместо вызова ReportPropertyChanged/ing я должен был бы вызвать OnPropertyChanged/ing.

ReportPropertyChanged/ing подразумевает, что контекст ищет изменения между исходным и текущим значением сущности, но так как это свойство является просто объектом статуса, который имеетбез сопоставления с магазином, концепция исходного значения не имеет смысла, поэтому контекст не может найти правильное сопоставление для этого свойства.

Использование OnPropertyChanged/ing только что исправило его.

...