Entity framework 在实体框架中使用异步方法';s检验法
我正在尝试重写Entity Framework 6中EnityFramework的DbContext.ValidateEntity()方法 我的问题是,我需要在验证逻辑中调用FirstOrDefaultAsync(),但这会导致重写出现问题,因为该方法没有标记为异步。这是我到目前为止的代码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
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了,没有动脑子!