我的应用程序使用BreezeJS,ASP.NET Web API和EF。
我正在尝试使用breeze保存对象,如下所示:
var saveOptions = this.manager.saveOptions.using({ resourceName: "SaveLocationSettings", tag: clientId, allowConcurrentSaves: true });
var obj = self.manager.saveChanges(null, saveOptions).then(saveSucceeded, saveFailed);
我在服务器端使用自定义保存方法,它返回一个SaveResult对象。但是,在客户端,实体管理器仍然保持修改状态。
我在Web API上的控制器是一个BreezeController。
根据breeze文档,如果您的自定义方法具有类似于Breeze SaveChanges()方法的签名,则它应该与SaveChanges()方法类似。但是,如果我使用breeze SaveChanges(),实体状态会正确更新。但是我的自定义端点保存不会更新实体状态,尽管数据会保存在数据库中。
经过一番调查后,我发现只有一个实体类型转到这个特定的保存端点才会发生这种情况。比如说,我有一个“位置”对象,其中包含与之关联的“可用性”集合,如下所示:
Class Location {
public Location() {
this.Availabilities = new HashSet<Availability>();
}
}
现在从客户端,如果我只更改Location对象的某些属性,它会正确处理hasChanges属性。但是,如果我仅更改“可用性”或“可用性”以及该位置的另一个属性,则在客户端上不会正确更新hasChanges。
这是我从WebAPI控制器调用的服务器端代码:
public SaveResult SaveLocation(Location l, List<MaxAvailability> maxAvailability, int changedBy)
{
// Create a SaveResult object
// we need to return a SaveResult object for breeze
var keyMappings = new List<KeyMapping>();
var entities = new List<object> {l, maxAvailability};
var saveResult = new SaveResult() { Entities = entities, KeyMappings = keyMappings, Errors = null };
try
{
if (l.LocationId == -1)
{
// add new location
l.LocationId = this.AddNewLocationWithItsAssociatedData(l, maxAvailability, changedBy);
}
else
{
// do changes to the existing location
this.UpdateExistingLocationWithItsAssociatedData(l, maxAvailability, changedBy);
}
}
catch (DbEntityValidationException ex)
{
// Log the error and add the errors list to SaveResult.
// Retrieve the error messages as a list of strings.
saveResult.Errors = this.GetErrors(ex);
}
return saveResult;
}
答案 0 :(得分:0)
我想我找到了答案。这是由于我的代码中的一些不好的做法。在修改现有位置的可用性时,我正在删除现有记录并添加新记录,而不是更新现有记录。这导致客户端可用性对象和数据库对象具有两种不同的状态。一旦解析,hasChanges()状态就像预期的那样。