ObjectStateManagerChanged не запускается для измененных объектов? - PullRequest
4 голосов
/ 30 августа 2011

Вот что я делаю в MyObjectContext конструктор класса:

ObjectStateManager.ObjectStateManagerChanged += ObjectStateManagerObjectStateManagerChanged;

и вот обработчик:

private void ObjectStateManagerObjectStateManagerChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e)
    {
        if (e.Element is MyClass)
        {
            var entity = e.Element as MyClass;

            var state = ObjectStateManager.GetObjectStateEntry(e.Element).State;
            if (e.Action == CollectionChangeAction.Add && state == EntityState.Added)
            {
                //this is working fine and all created entities 100% hit this point

            }

            //none of the below is ever resolves to true, 
            //and I need to be notified on each modified entity
            if (e.Action == CollectionChangeAction.Add && state == EntityState.Modified)
            {

            }
            else if (e.Action == CollectionChangeAction.Refresh && state == EntityState.Modified)
            {

            }
        }
    }

И все-таки сделайте следующий тест:

        var context = new MyObjectContext();
        context.SetMergeOption(MergeOption.OverwriteChanges);
        var company = new Company
        {
            Label = "Label",
        };
        context.Add(company);

        context.SaveChanges();


        company.Label = company.Label +" and so on";
        context.Update(company);
        context.SaveChanges();

Не происходит событие об обновлении юридического лица компании.Как я могу это гарантировать?Более интересно то, что компания включена в список сущностей, возвращаемых:

        IEnumerable<ObjectStateEntry> changedEntities =
            ObjectStateManager.GetObjectStateEntries(EntityState.Modified);

, который вызывается из метода MyObjectContext.SaveChanges().

Кто-нибудь знает, почему ObjectStateManagerChanged не вызывается для обновленных объектов?Или как реализовать аналогичную функциональность другим способом?

1 Ответ

4 голосов
/ 30 августа 2011

Поскольку это событие вызывается, только если ObjectStateManager не изменяется, если изменяется сущность. Это означает, что событие вызывается только когда вы присоединяете, вставляете или удаляете объект из отслеживания, но не если вы изменяете состояние уже отслеженного объекта. Это прямо описано в MSDN .

Если вы хотите реагировать на изменения в сущности, вы должны реализовать ее самостоятельно, например, внедрив INotifyPropertyChanged для типа сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...