2012-01-08 30 views
2

據我所知,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 
+0

是什麼事件,您有興趣,爲什麼?從上下文中添加/刪除對象,還是從數據庫插入或刪除記錄? – 2012-01-08 15:31:09

+0

@ProgrammingHero:從上下文中添加/刪除的對象。 – 2012-01-08 15:34:08

+0

@ProgrammingHero:至於爲什麼,我對各種原因感興趣。一個簡單的例子是,我可以知道何時更新顯示的符合某些標準的實體列表。 – 2012-01-08 15:37:53

回答

1

你可以使用ObjectStateManager? 它應該在添加對象後引發事件。在MSDN這裏顯示

,它看起來像正確的方式做到這一點:

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

+0

這幾乎是我需要的,但不完全。看到我的編輯我的原始問題。 – 2012-01-08 15:55:06

相關問題