C# breeze.sharp客户端未正确处理实体框架验证错误

C# breeze.sharp客户端未正确处理实体框架验证错误,c#,entity-framework,validation,breeze,breeze-sharp,C#,Entity Framework,Validation,Breeze,Breeze Sharp,此问题出现在Breeze.Sharp的0.5.4版本中。不确定是否应该在Breeze.Sharp或Breeze.ContextProvider.EF6中修复,但预期行为之间似乎存在脱节 意外行为: 我有一个包含EF6存储库的.NETWebAPI控制器 如果我通过BeforeSaveEntities override执行对象级验证,其中的指导是通过抛出EntityErrorsException使验证失败,那么Breeze.Sharp客户端会按照预期捕获到这一点,一切都会好起来 但是,如果我使用En

此问题出现在Breeze.Sharp的0.5.4版本中。不确定是否应该在Breeze.Sharp或Breeze.ContextProvider.EF6中修复,但预期行为之间似乎存在脱节

意外行为:

我有一个包含EF6存储库的.NETWebAPI控制器

如果我通过BeforeSaveEntities override执行对象级验证,其中的指导是通过抛出EntityErrorsException使验证失败,那么Breeze.Sharp客户端会按照预期捕获到这一点,一切都会好起来

但是,如果我使用Entity Framework ValidationAttribute类(而不是EntityErrorsException)执行属性级验证,则失败会作为包含错误集合的SaveResult返回到Breeze.Sharp客户端。在本例中,客户端引发异常:无法将“Newtonsoft.Json.Linq.JValue”类型的对象强制转换为“Newtonsoft.Json.Linq.JArray”类型。当Breeze.Sharp试图解析SaveResult的KeyMappings数组(为null)时,会发生此异常

解决方法:

目前,我没有更改所有验证属性以引发EntityErrorsException,而是在BreezeController的SaveChanges方法中解决了这一问题,方法是检查返回的SaveResults是否存在任何错误,如果发现错误,则将这些错误包装在异常中,然后引发给客户端:

[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
    var saveResult = _unitOfWork.Commit(saveBundle);
    if (saveResult.Errors != null && saveResult.Errors.Count > 0)
    {
        var errors = new List<EntityError>();
        foreach (var error in saveResult.Errors)
        {
            var entityError = error as EntityError; //errors are stored as List<object> in the SaveResult
            if (string.IsNullOrEmpty(entityError.ErrorMessage))
            {
                entityError.ErrorName = "Attribute Validation Error";
            }
            errors.Add(entityError);
        }
        throw new EntityErrorsException(errors);
    }
    return saveResult;
}