【问题标题】:BreezeJS Reconstruct SaveResult on Server in .NETBreezeJS 在 .NET 中的服务器上重建 SaveResult
【发布时间】:2015-05-21 22:47:57
【问题描述】:

我没有使用 Breeze 服务器端来保存 JObject,而是使用虚拟 contextprovider 来提取 EntityMap,然后对每个实体执行自定义验证并自己保存它们。如果保存成功,我如何重建 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?

【问题讨论】:

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


    【解决方案1】:

    经过反复试验,我发现SaveResult.KeyMapping 列表仅包含从插入的实体生成的旧键和新键。这是有道理的,因为客户端有更新的关键,不需要担心被删除的实体。

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

    1.循环entityMaps并将每个EntityInfoTempValue设置为客户端发送的key/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.通过在EntityFramework Context上调用Context.SaveChanges()来保存实体。这将为所有插入的实体生成密钥。

    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
        }));
    

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      相关资源
      最近更新 更多