Насколько я могу судить, 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