首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BreezeJS在.NET服务器上重构SaveResult

BreezeJS在.NET服务器上重构SaveResult
EN

Stack Overflow用户
提问于 2015-05-21 22:47:57
回答 1查看 95关注 0票数 0

我不是使用Breeze服务器端来保存JObject,而是使用一个虚拟的contextprovider来提取EntityMaps,然后对每个实体执行自定义验证并自己保存它们。如果保存成功,如何重构SaveResult对象以返回到客户端,以便BreezeJS客户端了解我的更改?

目前,我将返回以下SaveResult:

代码语言:javascript
复制
// 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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-02 18:53:48

经过一些尝试和错误之后,我发现SaveResult.KeyMapping列表只包含从插入实体生成的旧键和新键。这是有意义的,因为客户端有更新的键,不需要担心被删除的实体。

要构造SaveResult.KeyMapping列表,首先需要将每个insert实体的EntityInfo.AutoGeneratedKey.TempValue设置为从客户端发送的键,保存实体以获取新的密钥,然后创建KeyMapping列表并返回给客户端。

1.循环entityMaps并将每个EntityInfoTempValue设置为从客户端发送的键/id。

代码语言:javascript
复制
// 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列表。

代码语言:javascript
复制
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
    }));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30385603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档