我在项目中使用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;
}
非常感谢
答案 0 :(得分:0)
我对您的特定方法的主要反对意见是,您正在吞下错误并向客户返回看似“快乐”的SaveResult
。 BreezeJS客户端将假定保存成功并相应地更新您的缓存实体。 这不是个好主意!
您当然可以在服务器端捕获它,并且可能希望这样做以重塑错误响应。我认为我会在存储库中这样做,因为我不愿意在控制器中使用持久性逻辑。封装这些东西是存储库/工作单元模式的 raison d'etre 。
我不清楚这对客户端有何帮助。您仍然需要将错误发送给客户端,让客户端做一些合理的事情。
您可能希望查看Breeze Labs SaveErrorExtensions有关解释客户端错误的建议。在我看来,困难的是向用户传达可操作的情报。这是我们无法为您解决的业务/设计决策。我们可以为您提供信息;你必须对它有意义。
HTH。