Как я должен прослушивать добавление/удаление объектов из ObjectContext?

80
10

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

спросил(а) 2021-01-19T18:43:45+03:00 9 месяцев назад
1
Решение
65

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


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

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

ответил(а) 2021-01-19T18:43:45+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема