我没有使用Breeze服务器端来保存JObject,而是使用虚拟上下文提供程序来提取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?
答案 0 :(得分:0)
经过一些反复试验,我发现SaveResult.KeyMapping
列表只包含从插入实体生成的旧密钥和新密钥。这是有道理的,因为客户端具有更新密钥,不需要担心已删除的实体。
要构造SaveResult.KeyMapping
列表,首先需要将每个插入实体的EntityInfo.AutoGeneratedKey.TempValue
设置为从客户端发送的密钥,保存实体以获取新密钥,然后创建{{ 1}}列出并返回客户端。
1.点击KeyMapping
并将每个entityMaps
的{{1}}设置为从客户端发送的密钥/ ID。
TempValue
2.通过调用EntityFramework Context上的EntityInfo
来保存实体。这将为所有插入的实体生成密钥。
3.浏览实体地图中保存的实体,构建并返回// 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)));
列表。
Context.SaveChanges()