-1

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

Breeze $filter 投影线程

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

给出我是的事实:

    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 服务器上的微风控制器访问它们。

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

亲切的问候迈克

4

1 回答 1

2

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

第一个是在客户端检索到您的 DTO 并从中动态构建“部分”实体,如果需要进行任何更改,以后可以完全解决这些实体。请参阅 John Papa 的Code Camper示例以查看此示例。附带说明一下,如果您的 DTO 实际上在投影中包含 Breeze 实体,那么即使这样也没有必要。

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

于 2013-08-07T17:14:30.597 回答