Breeze 保存后实体状态不变
Breeze entity state doesn't change after saving
我的应用程序使用 BreezeJS、ASP.NET Web API 和 EF。
我正在尝试使用 breeze 保存一个 object,如下所示:
var saveOptions = this.manager.saveOptions.using({ resourceName: "SaveLocationSettings", tag: clientId, allowConcurrentSaves: true });
var obj = self.manager.saveChanges(null, saveOptions).then(saveSucceeded, saveFailed);
我在服务器端使用自定义保存方法,returns 一个 SaveResult object。但是,在客户端,实体管理器仍然维护修改后的状态。
我在 Web 上的控制器 API 是一个 Breeze 控制器。
根据 breeze 文档,如果您的自定义方法具有类似于 Breeze SaveChanges() 方法的签名,则它的工作方式应该类似于 SaveChanges() 方法。但是,如果我使用 breeze SaveChanges(),实体状态会正确更新。但是我的自定义端点保存不会更新实体状态,尽管数据保存在数据库中。
更新:
经过一番调查后,我发现这种情况只发生在一个实体类型转到这个特定保存端点的情况下。比如说,我有一个 'location' object,与 'availability' 的 collection 相关联,如下所示:
Class Location {
public Location() {
this.Availabilities = new HashSet<Availability>();
}
}
现在从客户端来看,如果我只更改 Location object 的一些 属性,它会正确处理 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;
}
我想我找到了答案。这是由于我的代码中的一些不良做法。在修改现有位置的可用性时,我没有更新现有记录,而是删除了现有记录并添加了一条新记录。这导致客户端可用性对象和数据库对象具有两种不同的状态。解决后,hasChanges() 状态的行为符合预期。
我的应用程序使用 BreezeJS、ASP.NET Web API 和 EF。
我正在尝试使用 breeze 保存一个 object,如下所示:
var saveOptions = this.manager.saveOptions.using({ resourceName: "SaveLocationSettings", tag: clientId, allowConcurrentSaves: true });
var obj = self.manager.saveChanges(null, saveOptions).then(saveSucceeded, saveFailed);
我在服务器端使用自定义保存方法,returns 一个 SaveResult object。但是,在客户端,实体管理器仍然维护修改后的状态。
我在 Web 上的控制器 API 是一个 Breeze 控制器。
根据 breeze 文档,如果您的自定义方法具有类似于 Breeze SaveChanges() 方法的签名,则它的工作方式应该类似于 SaveChanges() 方法。但是,如果我使用 breeze SaveChanges(),实体状态会正确更新。但是我的自定义端点保存不会更新实体状态,尽管数据保存在数据库中。
更新:
经过一番调查后,我发现这种情况只发生在一个实体类型转到这个特定保存端点的情况下。比如说,我有一个 'location' object,与 'availability' 的 collection 相关联,如下所示:
Class Location {
public Location() {
this.Availabilities = new HashSet<Availability>();
}
}
现在从客户端来看,如果我只更改 Location object 的一些 属性,它会正确处理 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;
}
我想我找到了答案。这是由于我的代码中的一些不良做法。在修改现有位置的可用性时,我没有更新现有记录,而是删除了现有记录并添加了一条新记录。这导致客户端可用性对象和数据库对象具有两种不同的状态。解决后,hasChanges() 状态的行为符合预期。