Breeze Webapi更新预测

时间:2013-08-06 23:07:15

标签: wcf-data-services breeze

在我最初的WebApi过滤和分页投影困境之后继续

Breeze $filter projections帖子

我现在正在尝试更新我的后端数据库,但收效甚微。

提供我的事实:

    public IQueryable<ConsigneDTO> Consignees(string refname)
    {
        IQueryable<ConsigneDTO> q = this.db.Consignes
             .Where(x => x.Refname == refname)
                  .Select(f => new ConsigneDTO {Refname = f.Refname, Consignee = f.Consignee, Address1 = f.Address1, Address2 = f.Address2, Address3 = f.Address3});
        return q;
    }

将这些数据从Breeze中恢复的最简单方法是什么?

我看到我更改的数据会在两个覆盖中重新出现

    protected override bool BeforeSaveEntity(EntityInfo entityInfo)
    {
    }

    protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap)
    {
    }

但是没有简单的方法可以将这些推送到底层上下文,这是一个源自Data.Services.Client.DataServiceContext的WCF服务。

如何致电

  Context.UpdateChanges(EntityInfo);

  Context.UpdateChanges(SaveMap);

特别考虑EntityInfo和SaveMap包含DTO?

我必须完全忽略SaveChanges()机制并进行自己的CRUD调用吗?我甚至没有看到有关更新预测的任何好的非微风的例子,这让我觉得这是根深蒂固的。

正如之前的帖子中所解释的,我可以改变关于这个项目的大部分内容。我唯一的问题是数据库在另一台服务器上,并且有不能公开的列,我在表中的唯一方法是EF5。

我选择使用OData-v3 / WCF-Data-Services轻薄地封装EF,并从Web服务器上的breeze控制器访问它们。

到目前为止,读取\查询\过滤和分页在SPA上都运行良好,但只有“C_UD”的R,我更愿意重新编写这个项目。

亲切的问候 麦克

1 个答案:

答案 0 :(得分:2)

Breeze EntityManager.saveChanges调用旨在保存对先前查询过的实体的更改。 Breeze可以自动执行此过程,因为它具有关于这些实体类型的元数据,并且能够在服务器上构造适当的代码以保留它们。在您的情况下,您从查询中返回的内容不是“实体”,除非您可以将它们转换为实体,否则Breeze将无法保留它们。所以你可以尝试几种方法。

第一种是在客户端检索时获取DTO,并动态构建它们的“部分”实体,如果需要进行任何更改,以后可以完全解析。请参阅John Papa的Code Camper示例以查看此示例。作为旁注,如果您的DTO实际上在投影中包含Breeze实体,那么即使这样也没有必要。

另一种方法是在尝试保存时彻底绕过Breeze。只需直接使用Breeze ajax适配器并将数据直接发布到您想要的任何端点。显然,在这种情况下,您需要编写保留发布数据所需的所有服务器端代码。