2011-12-27 48 views
2

問題:在我的模型中,我需要使用回調來處理任何ORM事件觸發前的數據庫實體對象。此外,我正在尋找一種方法來應用named-scope,所以我不需要爲每個查詢提供某些條件。舉個例子,當我在項目上使用Find on dbcontext對象時,我不需要提及每個調用的active = true。EntityFramework的Activerecord的回調版本和NamedScope

問題:

  1. 有什麼比得上在callbacks methods of ActiveRecord ASP.NET MVC(的EntityFramework)?如:after_save,before_save,after_create,before_create,after_validation,before_validation等。

  2. 我應該創建一個「模型視圖」來追加每個查詢與命令條件嗎?請提供一個示例或資源/教程。

回答

6

沒有這樣的事件/回調可用。 EF ObjectContext只提供ObjectMaterializedSavingChanges事件。首先可以用於在實體從數據庫物化(加載)時作出反應,其次可以用於在保存更改之前處理任何事情(類似於重寫SaveChanges方法)。

例子:

public void SavingChanges(object sender, EventArgs e) 
{ 
    ObjectContext context = (ObjectContext)sender; 

    var entities = context.ObjectStateManager 
          .GetObjectStateEntries(EntityState.Added) 
          .Where(e => !e.IsRelationship) 
          .Select(e => e.Entity) 
          .OfType<MyEntity>(); 

    // Now you have all entities of type MyEntity which will be added 
    // You can use similar approach for other type of entities or 
    // modified entities or deleted entities      
} 

EF不提供任何類型的全球環境/命名範圍。您必須始終確保您的查詢包含所有條件。例如,您可以創建自定義擴展方法和,而不是默認查找使用擴展方法,這將增加你所有的附加條件

例子:

public static MyEntity FindWithCondition(this IQueryable<MyEntity> query, int id) 
{ 
    return query.Where(...).FirstOrDefault(e => e.Id == id); 
}