breeze.sharp客户端无法正确处理实体框架验证错误

时间:2014-05-21 03:31:51

标签: c# entity-framework validation breeze breeze-sharp

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

意外行为:

我有一个包含EF6存储库的.Net Web API BreezeController。

如果我通过BeforeSaveEntities覆盖执行对象级别验证,其中指导是通过抛出EntityErrorsException来验证失败,那么Breeze.Sharp客户端会按预期捕获它,一切都很顺利。

但是,如果我使用Entity Framework ValidationAttribute类执行属性级别验证,而不是EntityErrorsException,则会将失败作为包含Errors集合的SaveResult返回给Breeze.Sharp客户端。在这种情况下,客户端抛出异常:无法转换类型' Newtonsoft.Json.Linq.JValue'输入' Newtonsoft.Json.Linq.JArray' 。当Breeze.Sharp尝试解析SaveResult的KeyMappings数组时,会发生此异常,该数组为null。

解决方法:

现在,我没有更改所有验证属性以抛出EntityErrorsException,而是通过检查返回的SaveResults是否存在任何错误,在我的BreezeController的SaveChanges方法中解决了这个问题,如果找到,则将这些错误包装在异常中然后我扔给客户:

[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;
}

1 个答案:

答案 0 :(得分:0)

我会在下一个版本发布之前尝试重新编写并修复它。