1

此问题出现在 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 客户端。在这种情况下,客户端会抛出异常:Unable to cast object of type 'Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JArray'。此异常发生在 Breeze.Sharp 尝试解析 SaveResult 的 KeyMappings 数组时,该数组为空。

解决方法:

现在,我没有更改我的所有验证属性以引发 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;
}
4

0 回答 0