在Breeze中调用SaveChanges时返回有意义的错误消息

在Breeze中调用SaveChanges时返回有意义的错误消息,breeze,asp.net-web-api2,Breeze,Asp.net Web Api2,我正在使用ASP.NET WebAPI 2和Breeze。我希望在使用SaveChanges()方法保存更改时能够返回有意义的错误消息。这是为了防止出现错误。 当前实现返回SaveResult。如何返回消息,例如 var cardDetail = _membershipContextProvider.Context.Database.SqlQuery<CardDetail>("IssuedCardsGetVerificationDetails @CardNo", parameter)

我正在使用ASP.NET WebAPI 2和Breeze。我希望在使用SaveChanges()方法保存更改时能够返回有意义的错误消息。这是为了防止出现错误。 当前实现返回SaveResult。如何返回消息,例如

var cardDetail = _membershipContextProvider.Context.Database.SqlQuery<CardDetail>("IssuedCardsGetVerificationDetails @CardNo", parameter).FirstOrDefault();
        if (cardDetail == null)
        {
            HttpResponseMessage msg = new HttpResponseMessage(HttpStatusCode.NotFound)
            {
                Content = new StringContent(string.Format("The beneficiary with Card No. {0} was found in the NHIF database", CardNo)),
                ReasonPhrase =string.Format("Card No. {0} Not Found in the NHIF Database!",CardNo)
            };
            throw new HttpResponseException(msg);
        }
        return cardDetail;
var cardDetail=\u membershipContextProvider.Context.Database.SqlQuery(“IssuedCardsGetVerificationDetails@CardNo”,参数).FirstOrDefault();
如果(cardDetail==null)
{
HttpResponseMessage msg=新的HttpResponseMessage(HttpStatusCode.NotFound)
{
Content=newstringcontent(string.Format(“在NHIF数据库中找到了卡号为{0}的受益人”,卡号)),
ReasonPhrase=string.Format(“在NHIF数据库中找不到卡号{0}!”,卡号)
};
抛出新的HttpResponseException(msg);
}
返回卡片详细信息;
您需要在自定义保存方法中抛出EntityErrorsException。此异常允许您为每个失败的实体指定顶级消息和自定义消息

[HttpPost]
public SaveResult MyCustomSaveMethod(JObject saveBundle) {
  ContextProvider.BeforeSaveEntitiesDelegate = SaveThatMightThrow;
  return ContextProvider.SaveChanges(saveBundle);
}


private Dictionary<Type, List<EntityInfo>> SaveThatMightThrow(Dictionary<Type,    List<EntityInfo>> saveMap) {
    List<EntityInfo> orderInfos;
    // if this save tries to save ANY orders throw an exception.
    if (saveMap.TryGetValue(typeof(Order), out orderInfos)) {
      var errors = orderInfos.Select(oi => {
        return new EFEntityError(oi, "WrongMethod", "Entity level detail error - Cannot save orders with this save method", "OrderID");
      });
      var ex =  new EntityErrorsException("Top level error - Orders should not be saved with this method", errors);
      // if you want to see a different error status code use this.
      // ex.StatusCode = HttpStatusCode.Conflict; // Conflict = 409 ; default is Forbidden (403).
      throw ex;
    }
    return saveMap;
  }
[HttpPost]
public SaveResult MyCustomSaveMethod(JObject saveBundle){
ContextProvider.BeforeSaveentiesDelegate=saveThat可能抛出;
返回ContextProvider.SaveChanges(saveBundle);
}
可能抛出的专用字典保存(字典保存映射){
列出订单信息;
//如果此保存尝试保存任何订单,则抛出异常。
if(saveMap.TryGetValue(typeof(Order),out orderInfos)){
var errors=orderInfos.Select(oi=>{
返回新的EFEntityError(oi,“ErrorMethod”,“实体级详细信息错误-无法使用此保存方法保存订单”,“OrderID”);
});
var ex=新EntityErrorsException(“顶级错误-不应使用此方法保存订单”,错误);
//如果要查看不同的错误状态代码,请使用此选项。
//ex.StatusCode=HttpStatusCode.Conflict;//Conflict=409;禁止使用默认值(403)。
掷骰子;
}
返回saveMap;
}

请注意,Breeze 1.4.16中存在一个bug,其中顶级错误没有正确传播(它以空字符串的形式返回到客户端),但是实体级错误消息将正常传播。此错误已在最新的GitHub repos中修复,但您需要从breeze.js和breeze.server.net repos获得修复代码,因为修复程序同时适用于breeze.js客户端和breeze.server.net中的ContextProvider类。或者你可以等待一周后的下一个微风发布

您是否尝试过实现自定义保存方法?我的想法是,您真正需要做的就是采用当前的saveChanges实现,并在其中添加您的逻辑,以添加自定义错误消息,以便尝试准确地找出阻止您这样做的原因。