據我所知,ObjectContext
不公開任何直接的方式來監聽添加/刪除的項目。您可能會掛鉤到SavingChanges
事件,並查詢ObjectStateManager
哪些項目已被添加或刪除。但這有幾個問題:我應該如何偵聽從ObjectContext中添加/刪除的實體?
- 通知將發生在項目實際添加到上下文之前。
- 通知將隨時發生任何更改已保存(即使沒有任何項目被添加/刪除)。
- 它似乎不是如何使用
SavingChanges
- 它是更多的驗證數據比通知的變化。 - 這是主觀的,但它只是感覺對我錯了。
我已經通過實現有限版本的存儲庫模式來解決此問題 - 它處理創建,讀取和刪除操作,但更新仍然通過直接操作實體本身的屬性來執行(然後保存從我的存儲庫中更改)。
我稍微不安這有幾個原因:
- 我以爲
ObjectContext
應該從資源庫中的圖案更換存儲庫。這感覺就像我在複製實體框架應該爲我做的工作。 - 使用Repository模式的不完整版本(來自CRUD的C,R和D)似乎有點奇怪。不應該爲所有4個CRUD操作使用存儲庫,或者不使用?
- 必須有一個原因,實體框架不支持添加/刪除通知。無論如何,通過選擇實現它們,我是否會創建一個令實體框架開發人員選擇避免的設計難題?
供參考,這是我的倉庫的一個大致的輪廓:
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();
}
...
}
我是很新的實體框架,所以讓我知道,如果我的做法是完全錯誤的。
編輯:在迴應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
是什麼事件,您有興趣,爲什麼?從上下文中添加/刪除對象,還是從數據庫插入或刪除記錄? – 2012-01-08 15:31:09
@ProgrammingHero:從上下文中添加/刪除的對象。 – 2012-01-08 15:34:08
@ProgrammingHero:至於爲什麼,我對各種原因感興趣。一個簡單的例子是,我可以知道何時更新顯示的符合某些標準的實體列表。 – 2012-01-08 15:37:53