2013-08-06 62 views
-1

继续在我最初的WebAPI过滤后和分页投影困境微风的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; 
    } 

请告诉我最简单的方法来把这个数据从回来微风?

我看到我的改变的数据回来两个覆盖

protected override bool BeforeSaveEntity(EntityInfo entityInfo) 
    { 
    } 

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

但没有简单的方法推到这些底层的背景下这是一个WCF服务从Data.Services.Client.DataServiceContext而产生。

我怎么叫

Context.UpdateChanges(EntityInfo); 

Context.UpdateChanges(SaveMap); 

尤其是考虑EntityInfo和SaveMap包含DTO?

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

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

我已经选择使用OData-v3/WCF-Data-Services精简打包EF,并从Web服务器上的breeze控制器访问它们。

到目前为止,阅读\查询\过滤和分页对于SPA来说都很有效,但只有“C_UD”的R,我更愿意重写这个项目。

亲切的问候 迈克

+0

我将尽力与你保持一致 - 你说你有一个WCF服务,你从中获得数据 - 你在这里做什么?您是否试图将数据发回GET方法?我希望不是......如果你正试图将数据保存到WCF服务中,你有没有UPDATE或POST方法?你有没有尝试拦截保存并使用这些方法?如果您使用WCF服务并希望Breeze能够通过发布数据来覆盖GET方法,那么我觉得您需要对WCF服务进行更多的研究。请理解我与Breeze团队无关...... –

+0

@PWKad欣赏努力:)我熟悉WCF(但始终在学习),我可以用我的控制器从数据服务器获取.Select() ; q.Address3 = “foo” 的; Context.UpdateObject(Q); Context.SaveChanges;我的问题是更微风相关。 Breeze将BeforeSaveEntity中的EntityInfo类或其他覆盖中的SaveMap和SaveBundle返回给我。这些似乎都不能传递给UpdateObject(),即使我可以,由于Select()投影,它是一个DTO,我不认为WCF会知道如何处理它。我将去除投影作为测试并克服微风障碍。 – Mike

+0

我已经更新了最初的问题,以更多地指出Breeze覆盖和DTO - 再次感谢 – Mike

回答

2

微风EntityManager.saveChanges调用旨在更改保存到先前查询实体。 Breeze可以自动执行此过程,因为它具有有关这些实体类型的元数据,并且能够在服务器上构建适当的代码来保存它们。在你的情况下,你从查询中返回的内容不是'实体',除非你可以将它们变成实体,Breeze将不能坚持它们。所以你有几种方法可以尝试。

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

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

+0

谢谢Jay,我认为他们是实体但是“DTO实体”,savemap看起来不错,而BeforeSaveEntity中的entityInfo确实显示EntityState为Modified,并且跟踪已更改属性的OriginalValuesMap。一切看起来都很完整,除了一种方法将其转换回原始表 我一直使用CodeCamper和TempHire项目作为模板;我认为我的根本区别在于,我的投影是Controller中的服务器端,而不是客户端中的.js。我们不能允许Breese出于安全考虑,所以我们采用了WebApi而不是真正的Odata。欣赏任何其他帮助:) – Mike