1

この問題は、Breeze.Sharp の 0.5.4 リリースに含まれています。Breeze.Sharp またはおそらく Breeze.ContextProvider.EF6 で修正する必要があるかどうかはわかりませんが、予想される動作の間に切断があるようです。

予期しない動作:

EF6 リポジトリを含む .Net Web API BreezeController があります。

BeforeSaveEntities オーバーライドを介してオブジェクト レベルの検証を実行すると、ガイダンスは EntityErrorsException をスローして検証に失敗することになりますが、Breeze.Sharp クライアントはこれを期待どおりにキャッチし、すべて問題ありません。

ただし、Entity Framework の ValidationAttribute クラスを使用して属性レベルの検証を実行すると、EntityErrorsException の代わりに、Breeze.Sharp クライアントに失敗が、Errors コレクションを含む SaveResult として返されます。この場合、クライアントは例外をスローします: Unable to cast object of type 'Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JArray' . この例外は、Breeze.Sharp が null である 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