使用 Breeze SaveChanges() 方法处理服务器异常

Handling server exceptions with Breeze SaveChanges () method

我在我的项目中使用带有 Angular 和 EF 6 的 Breeze,并且我有一个可以执行 CRUD 操作的表单。

我有一个名为 Car2Sale 的实体,它是一个多对多 table(Id、CarId、SaleId)。 Id 是此 table 的 PK,而 CardId 和 SaleId 是其关联的 table 的 FK,它们在唯一索引中组合在一起。 (CarId, SaleId).

当我想使用数据库中已存在的 CarId 和 SaleId 添加新的 Car2Sale 实体时,我在服务器端收到此错误:违反唯一约束...在此方法中:

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

这是正确的,因为我想防止用户在同一个 table 中引入相似的键。

在客户端,我收到

中的错误

entity.entityAspect.getValidationErrors();

我使用Toastr.js显示它。

我想知道在这种情况下,在服务器端的 SaveChanges() 方法中进行异常处理的最佳做法是什么。

我正在考虑在服务器端使用 try catch 和 return 我自己的 SaveResult,如下所示:

[HttpPost]  
public SaveResult SaveChanges(JObject saveBundle) {            
    SaveResult myResult = null;  
    try {  
        myResult = _repository.SaveChanges(saveBundle);  
    } catch(Exception ex) {  
        Logger.Log(ex.toString());  
    }   
    return myResult;  
} 

非常感谢

我对您的特定方法的主要反对意见是,您吞下了错误并将看似 "happy" SaveResult 的内容返回给客户。 BreezeJS 客户端将假设保存成功并相应地更新您的缓存实体。 这不是个好主意!

您当然可以在服务器端捕获它,并且可能想要这样做以重塑错误响应。我认为我会在存储库内部这样做,因为我不愿意在我的控制器中使用持久性逻辑。封装这些东西是 repository/Unit-of-Work 模式的 存在理由

我不清楚这对客户端有何帮助。您仍然需要将错误发送给客户端,并让客户端对其进行一些合理的处理。

您可能想查看 Breeze Labs SaveErrorExtensions 以了解有关解释客户端错误的想法。在我看来,困难的事情是向用户传达可操作的情报。这是我们无法为您解决的 business/design 决定。我们可以为您提供信息;你必须理解它。

HTH.