我不是使用Breeze服务器端来保存JObject,而是使用一个虚拟的contextprovider来提取EntityMaps,然后对每个实体执行自定义验证并自己保存它们。如果保存成功,如何重构SaveResult对象以返回到客户端,以便BreezeJS客户端了解我的更改?
目前,我将返回以下SaveResult:
// Using example here (https://github.com/Breeze/breeze.js.samples/issues/33)
// to extract EntityMaps from JObject.
// The return result is a Dictionary<Type, EntityInfo>.
var entityMaps = SaveBundleToSaveMap.Convert(saveBundle);
// ... Code to save entities to DB
// SaveResult to be returned to the client.
return new SaveResult()
{
Entities = entityMaps.SelectMany(innerEi => innerEi.Value.Select(ie => ie.Entity)).ToList<object>(),
Errors = null,
KeyMappings = new List<KeyMapping>()
};如何为单个主键构造KeyMapping列表?如何为复合密钥构造KeyMapping?
发布于 2015-11-02 18:53:48
经过一些尝试和错误之后,我发现SaveResult.KeyMapping列表只包含从插入实体生成的旧键和新键。这是有意义的,因为客户端有更新的键,不需要担心被删除的实体。
要构造SaveResult.KeyMapping列表,首先需要将每个insert实体的EntityInfo.AutoGeneratedKey.TempValue设置为从客户端发送的键,保存实体以获取新的密钥,然后创建KeyMapping列表并返回给客户端。
1.循环entityMaps并将每个EntityInfo的TempValue设置为从客户端发送的键/id。
// Extract out from loop to make it more readable.
Action<EntityInfo> processEntityInfo = (ei) =>
{
if (ei.EntityState == EntityState.Added && (ei.AutoGeneratedKey != null && ei.AutoGeneratedKey.AutoGeneratedKeyType == AutoGeneratedKeyType.Identity))
{
var entity = ei.Entity;
var tempValue = ei.AutoGeneratedKey.Property.GetValue(entity);
ei.AutoGeneratedKey.TempValue = tempValue;
}
};
entityMaps.ToList().ForEach(map => map.Value.ForEach(ei => processEntityInfo(ei)));2.通过调用Context.SaveChanges()上下文中的EntityFramework来保存实体。这将为所有插入的实体生成密钥。
3.循环遍历实体映射中保存的实体,构造并返回KeyMapping列表。
return entityMaps.SelectMany(entityMap =>
entityMap.Value
.Where(entityInfo => entityInfo.EntityState == EntityState.Added && (entityInfo.AutoGeneratedKey != null && entityInfo.AutoGeneratedKey.AutoGeneratedKeyType == AutoGeneratedKeyType.Identity))
.Select(entityInfo => new KeyMapping
{
EntityTypeName = entityInfo.Entity.GetType().FullName,
RealValue = entityInfo.AutoGeneratedKey.Property.GetValue(entityInfo.Entity),
TempValue = entityInfo.AutoGeneratedKey.TempValue
}));https://stackoverflow.com/questions/30385603
复制相似问题