Как я должен прослушивать добавление/удаление объектов из ObjectContext?
Насколько я могу судить, 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, поэтому дайте мне знать, если мой подход полностью ошибочен.
EDIT: В ответ на предложение 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
Не могли бы вы использовать ObjectStateManager
?
Он должен поднять событие после добавления объекта.
показанный здесь в MSDN, это выглядит как правильный способ: