BreezeJS在.NET中的服务器上重建SaveResult

时间:2015-05-21 22:47:58

标签: angularjs asp.net-web-api entity-framework-6 breeze

我没有使用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?

1 个答案:

答案 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()