使用 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.
我在我的项目中使用带有 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.