Entity framework 在实体框架中使用异步方法';s检验法

Entity framework 在实体框架中使用异步方法';s检验法,entity-framework,validation,asynchronous,Entity Framework,Validation,Asynchronous,我正在尝试重写Entity Framework 6中EnityFramework的DbContext.ValidateEntity()方法 我的问题是,我需要在验证逻辑中调用FirstOrDefaultAsync(),但这会导致重写出现问题,因为该方法没有标记为异步。这是我到目前为止的代码 protected override DbEntityValidationResult ValidateEntity ( DbEntityEntry entityEntry, IDictionary&l

我正在尝试重写Entity Framework 6中EnityFramework的DbContext.ValidateEntity()方法

我的问题是,我需要在验证逻辑中调用FirstOrDefaultAsync(),但这会导致重写出现问题,因为该方法没有标记为异步。这是我到目前为止的代码

protected override DbEntityValidationResult ValidateEntity ( 
  DbEntityEntry entityEntry, IDictionary<object, object> items) 
{ 
    var result = new DbEntityValidationResult(
        entityEntry, new List<DbValidationError>()); 

    if (entityEntry.Entity is Post && entityEntry.State == EntityState.Added) 
    { 
        Post post = entityEntry.Entity as Post;

        // This line is illegal as the ValidateEntity()
        // method is not asynchronous
        var errors = await ValidatePost(post);

        // error processing here..
    } 

    if (result.ValidationErrors.Count > 0)  
    { 
        return result; 
    } 
    else  
    { 
        return base.ValidateEntity(entityEntry, items); 
    } 
}


public async Task<ICollection<DbValidationError>>
ValidatePost(Post post)
{
   var errors = new List<DbValidationError>();

   Post temp = await this.DbContext.Posts
       .FirstOrDefaultAsync(x => x.Title == entity.Title);

   if ((temp != null) && (temp.Id != entity.Id))
   {
       errors.Add(new DbValidationError(
          "Title", "A Post already exists with the title " + temp.Title
       ));
   }

   return errors;
}
受保护的覆盖DbEntityValidationResult ValidateEntity(
DbEntityEntry entityEntry,IDictionary项)
{ 
var result=新的DbEntityValidationResult(
entityEntry,新列表());
if(entityEntry.Entity为Post&&entityEntry.State==EntityState.Added)
{ 
Post Post=entityEntry。实体作为Post;
//此行作为ValidateEntity()是非法的
//方法不是异步的
var错误=等待ValidatePost(post);
//此处处理时出错。。
} 
如果(result.ValidationErrors.Count>0)
{ 
返回结果;
} 
其他的
{ 
返回基数ValidateEntity(entityEntry,items);
} 
}
公共异步任务
ValidatePost(Post)
{
var errors=新列表();
Post temp=等待this.DbContext.Posts
.FirstOrDefaultAsync(x=>x.Title==entity.Title);
if((temp!=null)&&(temp.Id!=entity.Id))
{
错误。添加(新的DbValidationError)(
“标题”,“已存在标题为“+临时标题”的帖子
));
}
返回错误;
}
上面显示的实际验证逻辑有些简化,但它说明了问题所在


如何从ValidateEntity/非异步方法中调用.FirstOrDefaultsAsync()或任何实体框架异步方法?

您必须阻止,这会否定
ValidatePost()中异步调用的好处。
。为什么不在内部使用EF调用的同步版本呢?我找不到同步版本。FirstOrDefault()-我以为它已经被删除了?请确保您引入了
系统.Linq
命名空间。谢谢Anthony-我太愚蠢了,太依赖intellisense了,没有动脑子!