vul*_*ven 2 asp.net-mvc activerecord entity-framework asp.net-mvc-3
问题:在我的模型中,我需要在触发任何ORM事件之前使用回调来处理db实体对象.此外,我正在寻找一种方法来应用命名范围,所以我不需要为每个查询提供某些条件.例如; 当我在项目的dbcontext对象上使用Find时,我不应该为每个调用提及active = true.
问题:
在ASP.NET MVC(EntityFramework)中是否有类似于ActiveRecord的回调方法?如:after_save,before_save,after_create,before_create,after_validation,before_validation等.
我应该创建一个"模型视图"来附加具有命令条件的每个查询吗?请提供示例或资源/教程.
没有.没有这样的事件/回调可用.EF ObjectContext仅提供ObjectMaterialized和SavingChanges活动.第一个可用于在实体从数据库实现(加载)时作出反应,第二个可用于在保存更改之前处理任何事物(它类似于重写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
}
Run Code Online (Sandbox Code Playgroud)
EF不提供任何类型的全局条件/命名范围.您必须始终确保查询包含所有条件.例如,您可以创建自定义扩展方法而不是默认查找使用该扩展方法,该方法将添加所有附加条件
例:
public static MyEntity FindWithCondition(this IQueryable<MyEntity> query, int id)
{
return query.Where(...).FirstOrDefault(e => e.Id == id);
}
Run Code Online (Sandbox Code Playgroud)