Как я должен слушать сущности, добавляемые / удаляемые из ObjectContext? - PullRequest
2 голосов
/ 08 января 2012

Насколько я могу судить, ObjectContext не предоставляет прямого способа прослушивания добавляемых / удаляемых элементов. Вы можете подключиться к событию SavingChanges и запросить ObjectStateManager, для каких элементов были добавлены или удалены. Но это имеет несколько проблем:

  • Уведомление будет происходить до того, как элементы будут фактически добавлены в контекст.
  • Уведомление будет появляться в любое время любые изменения сохраняются (даже если элементы не добавляются / удаляются).
  • Не похоже, как SavingChanges было предназначено для использования - это больше для проверки данных, чем для уведомления об изменениях.
  • Это субъективно, но просто кажется неправильным для меня.

Я обошел это, реализовав ограниченную версию шаблона репозитория - он обрабатывает создание, чтение и удаление, но обновления по-прежнему выполняются путем непосредственного управления свойствами самих сущностей (а затем сохранения изменений из моего хранилище).

Я немного обеспокоен этим по нескольким причинам:

  • Я думал, что ObjectContext должен был заменить хранилище из шаблона хранилища. Такое ощущение, что я дублирую работу, которую Entity Framework должен делать для меня.
  • Использование неполной версии шаблона репозитория (C, R и D из CRUD) кажется немного странным. Разве хранилище не должно использоваться ни для всех 4 операций CRUD, ни для каких?
  • Должна быть причина, по которой Entity Framework не поддерживает уведомления о добавлении / удалении. Решив все же реализовать их, я создаю головную боль дизайна, которую разработчики Entity Framework решили избежать?

Для справки, вот примерный план моего хранилища:

public class EntityArgs<T> : EventArgs
    where T : EntityObject
{
    ....

    public T Entity
    {
        get { return this.entity; }
    }
}

public delegate void EntityEventHandler<T>(object sender, EntityArgs<T> args) where T: EntityObject;

public class EntityRepository
{
    public event EntityEventHandler<Foo> FooAdded;
    public event EntityEventHandler<Foo> FooDeleted;

    ...

    public EntityRepository()
    {
        this.entities = new Entities();
    }

    public IEnumerable<Foo> Foos
    {
        get { return this.entities.Foos; }
    }

    public void AddFoo(Foo foo)
    {
        this.entities.Foos.AddObject(foo);
        this.entities.SaveChanges();
        this.OnFooAdded(foo);
    }

    public void DeleteFoo(Foo foo)
    {
        this.entities.Foos.DeleteObject(foo);
        this.entities.SaveChanges();
        this.OnFooDeleted(foo);
    }

    public void SaveChanges()
    {
        this.entities.SaveChanges();
    }

    ...
}

Я довольно новичок в Entity Framework, поэтому дайте мне знать, если мой подход полностью неверен.

РЕДАКТИРОВАТЬ: В ответ на предложение Erix использовать ObjectStateManager, это почти решает мою проблему, но не совсем. Проблема в том, что я хочу получать уведомления, когда в entities.Foos будут отражены изменения. ObjectStateManager.ObjectStateManagerChanged происходит, когда вызывается AddObject, но до вызова SaveChanges. Итак:

entities.ObjectStateManager.ObjectStateManagerChanged += (s, e) =>
    Console.WriteLine("Action: {0}, Object: {1}, Count: {2}", e.Action, e.Element, entities.Foos.Count());
var foo = ...
Console.WriteLine("Count: {0}", entities.Foos.Count());
entities.Foos.AddObject(foo);
entities.Foos.SaveChanged();
Console.WriteLine("Count: {0}", entities.Foos.Count());

// Output:
// Count: 0
// Action: Add, Object: ..., Count: 0
// Count: 1

1 Ответ

1 голос
/ 08 января 2012

Не могли бы вы использовать ObjectStateManager?Он должен вызывать событие после добавления объекта.

, показанный здесь в MSDN, выглядит как правильный способ сделать это:

http://msdn.microsoft.com/en-us/library/ee705449.aspx

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