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

时间:2015-06-10 06:37:41

标签: angularjs breeze

我在项目中使用Breeze和Angular以及EF 6,我有一个表格可以执行CRUD操作。

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

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

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

这是正确的,因为我想阻止用户在同一个表中引入类似的键。

在客户端,我收到了

中的错误

entity.entityAspect.getValidationErrors();

我用Toastr.js显示它。

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

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

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

非常感谢

1 个答案:

答案 0 :(得分:0)

我对您的特定方法的主要反对意见是,您正在吞下错误并向客户返回看似“快乐”的SaveResult。 BreezeJS客户端将假定保存成功并相应地更新您的缓存实体。 这不是个好主意!

您当然可以在服务器端捕获它,并且可能希望这样做以重塑错误响应。我认为我会在存储库中这样做,因为我不愿意在控制器中使用持久性逻辑。封装这些东西是存储库/工作单元模式的 raison d'etre

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

您可能希望查看Breeze Labs SaveErrorExtensions有关解释客户端错误的建议。在我看来,困难的是向用户传达可操作的情报。这是我们无法为您解决的业务/设计决策。我们可以为您提供信息;你必须对它有意义。

HTH。