Я использую breezejs в ASP.NET MVC 4 SPA и durandal project с EF 5.0. Сначала база данных базы данных, и все работает нормально, за исключением определенного сценария.с использованием Breezejs для захвата исключения внешнего ключа в SaveChanges()
Простите меня, если я кажусь чем-то вроде noob относительно javascript и материала SPA. Я учусь, когда иду.
вот мои 2 модели от EF
Project.cs
public partial class Project
{
public Project()
{
this.Timesheets = new HashSet<Timesheet>();
}
public int ProjectId { get; set; }
public Nullable<int> ClientId { get; set; }
public string ProjectName { get; set; }
public string ProjectDescription { get; set; }
public Nullable<decimal> ProjectRate { get; set; }
public virtual Client Client { get; set; }
public virtual ICollection<Timesheet> Timesheets { get; set; }
}
Client.cs
public partial class Client
{
public Client()
{
this.Projects = new HashSet<Project>();
this.Timesheets = new HashSet<Timesheet>();
}
public int ClientId { get; set; }
public string ClientNo { get; set; }
public string ClientName { get; set; }
public string CompanyName { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public string County { get; set; }
public Nullable<decimal> ClientRate { get; set; }
public string EmailAddress { get; set; }
public virtual ICollection<Project> Projects { get; set; }
public virtual ICollection<Timesheet> Timesheets { get; set; }
}
отрывок из моего клиента ViewModel
function deleteClient(model) {
app.showMessage('Are you sure you want to DELETE this record?', 'Delete a Record', ['Yes', 'No'])
.then(function (dialogresult) {
if (dialogresult == "Yes") {
models.remove(model);
model.entityAspect.setDeleted();
return saveRecord(model);
}
});
};
function saveRecord(model) {
return repository.saveEntity(model)
.fail(handleFailed);
function handleFailed(error) {
var err = "Error retrieving Clients : " + error.message;
error(err);
logger.error(err, null, null, true);
return;
}
};
отрывок из repository.js (DataContext)
function saveEntity(masterEntity) {
return manager.saveChanges().fail(saveFailed);
function saveFailed(error) {
logger.error("Error saving : " + error.message, null, null, true);
}
}
здесь отрывок из моего ProjectBillingController.cs
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
Вот мой сценарий,
У меня есть строка проект "P1", который имеет ссылку на клиент "ABC" , Если я пытаюсь удалить клик «ABC», бриз выдает исключение внутри SaveChanges в моем WEBAPI-контроллере «ProjectBillingController.cs».
Я знаю, что в этом мире SQL это должна быть ожидаемая ошибка.
Но мои вопросы ...
- Могу ли я захватить эту ошибку ограничения на стороне клиента, прежде чем он доберется до сервера «ProjectBillingController.cs»?
- Единственный способ, с помощью которого я разрешаю эту проблему, - сделать еще один запрос, чтобы увидеть, есть ли какие-либо строки в объекте Project с этим Клиентом, и если это прекратить удаление, в противном случае продолжить удаление. Есть ли другой способ сделать это?
- Если я пишу это «Validation логики» внутри моей ViewModel или datacontent (хранилище)
Мои извинения, я, кажется, решил эту проблему. Моя проблема заключалась в том, что у меня была опечатка в моем методе logger.error(). Это должно быть logger.logError(). и из-за этого ошибка не возвращалась клиенту, она давала неопределенное сообщение. Когда я запускал его через debug, я видел исключение из ограничения внешнего ключа и думал, что он не возвращается к клиенту. Как только я изменил имя. ошибка возвращалась в .failed() часть обещания saveChanges(), и я могу видеть ошибку. –