0

如何在 saveChanges 失败函数中使用 Breeze 管理器在客户端(如 sql raiserror 级别)获取 Sql Server 数据库错误详细信息。例如 :

// SERVER-SIDE (SQL-SERVER : TRIGGER - After Insert)

    RAISERROR ('Espace utilise par Place, Cannot delete.', 16, 1)
    ROLLBACK TRAN
    RETURN

// CLIENT-SIDE (BREEZE : saveChanges - saveFailed)    
        var saveChanges = function () {
          .....
          function saveFailed(error) {
                var msg = 'Save failed: ' + getErrorMessages(error);
                logError(msg, error);
                error.message = msg;
                throw error;
          }
     };

更新 1:好的,在将我的微风版本更新到 1.4.1 后,我在客户端收到了错误详细信息,但是:

a) 应用程序在服务器端(Breeze 控制器 Api)停止,在下面的代码点出现 InvalidOperationException,没有分配任何调试断点。

 [HttpPost]
 public SaveResult SaveChanges(JObject saveBundle)
 {
   return _contextProvider.SaveChanges(saveBundle);
 }

b)如果我强制它继续,我会在 Breeze saveChanges saveFailed 级别的客户端收到错误。如何管理此错误以绕过 Breeze 服务器端 api 控制器错误处理程序,但在客户端继续拥有相关信息?

在等待足够的答案时,我试图在 BeforeSaveEntities 范围内报告这些业务规则。但是禁止使用所有触发器规则来代替 BeforeSaveEntities 会很痛苦:它们没有相同的功能。

4

1 回答 1

0

您是否考虑过使用 try/catch 重新实现SaveChangesWeb API 方法?

您应该能够拦截异常,对其进行分析,并将其更改为您认为适合客户端的任何响应。

2013 年 8 月 21 日更新

我想清楚你的问题和我的回答。如果您什么都不做,并且您的 Web API 方法中存在未捕获的异常,则服务器上的 Breeze.NET 应该转发该错误,而 BreezeJS 会将其转发给您的 saveChanges 失败处理程序。这符合你的经验,对吗?

我假设您想拦截服务器上的异常,并可能为客户端重新塑造异常或编写您自己的(失败的)对客户端的响应。为此,我推荐了 try/catch。

你有什么样的麻烦“试图用 Try/Catch 装饰服务器端 saveChanges ”?我认为这应该捕获 SQL 服务器抛出的异常......但也许不是。执行可能发生在 Web API 方法之外,在[BreezeControllerAttribute](委托给[BreezeQueryableAttribute]包装了 Web API的 a [QueryableAttribute])的范围内。

是现在的问题吗?

经过进一步思考,try/catch 的更好位置可能是在SaveChangesCore自定义(派生)实现中覆盖该方法EFContextProvider

公共类 YourCustomProvider : EFContextProvider<YourDbContext>
{
    受保护的覆盖无效 SaveChangesCore(SaveWorkState saveWorkState)
    {
        尝试
        {
            base.SaveChangesCore(saveWorkState);
        }
        捕捉(System.Exception ex)
        {
            // 任何
        }       
    }
}

如果这没有抓住它,那么故障就更难达到了,你会为 Breeze.NET 提供一个很好的论据,在[BreezeQueryableAttribute].

作为一种解决方法,您可能必须重新实现[BreezeControllerAttribute](它是开源的)来为自己提供该钩子。如果你这样做了......并且效果很好......请将其发送给我们(克隆/分叉/拉取请求),以便其他人受益。当我们有时间时,我们也会独立调查这个问题。

于 2013-08-27T07:05:45.660 回答