2011-12-27 45 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); 
}