在我最初的WebApi过滤和分页投影困境之后继续
我现在正在尝试更新我的后端数据库,但收效甚微。
提供我的事实:
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,我更愿意重新编写这个项目。
亲切的问候 麦克
答案 0 :(得分:2)
Breeze EntityManager.saveChanges调用旨在保存对先前查询过的实体的更改。 Breeze可以自动执行此过程,因为它具有关于这些实体类型的元数据,并且能够在服务器上构造适当的代码以保留它们。在您的情况下,您从查询中返回的内容不是“实体”,除非您可以将它们转换为实体,否则Breeze将无法保留它们。所以你可以尝试几种方法。
第一种是在客户端检索时获取DTO,并动态构建它们的“部分”实体,如果需要进行任何更改,以后可以完全解析。请参阅John Papa的Code Camper示例以查看此示例。作为旁注,如果您的DTO实际上在投影中包含Breeze实体,那么即使这样也没有必要。
另一种方法是在尝试保存时彻底绕过Breeze。只需直接使用Breeze ajax适配器并将数据直接发布到您想要的任何端点。显然,在这种情况下,您需要编写保留发布数据所需的所有服务器端代码。