如何在不使用EF的情况下向我的实体添加上下文元数据?

时间:2013-03-19 10:44:34

标签: javascript asp.net-mvc sharepoint breeze

我必须实现一个架构,遗憾的是,我们正在使用SharePoint 2013作为我们的主要数据库。 (不是我的选择,如果你没有选择那个)。我在服务器上有一个Asp.Net MVC外观应用程序,处理来自SP和其他几个数据源的数据组合,然后是一个JavaScript SPA作为客户端。另一个问题是客户端需要能够脱机工作,因此我需要使用IndexedDB存储数据以进行脱机访问。

这似乎是breeze.js的完美用例。我的基本架构是在MVC外观中定义一个强类型模型,它将包装我从SP获得的无类型数据(在表单object [“property”]中 - 使用SP客户端对象模型)。 Breeze将处理此模型与客户端之间的同步,我将使用导出/导入功能根据需要在IndexedDB中缓存数据。

到目前为止一切顺利。但是...... breeze网站上的SOA示例仍处于开发阶段(对我来说,这基本上是一个SOA架构,每个SP列表都要编写一个服务)。我能找到的最接近的是NoDB样本,但是这个硬编码客户端上的元数据。我想在MVC模型中建立关系和验证,然后将它们传递给客户端,因此验证可以在两个地方运行相同的声明。

这可能吗?如果是这样 - 怎么样?如果没有,是否有人有解决方法或更好的主意?我已经决定在两个不同的地方定义模型(外观和隐含的SP列表结构)。我非常希望避免在客户端第三次实施它。我愿意让breeze.js直接与SP REST端点对话,但我对https://stackoverflow.com/a/15364503/1014822的理解是,实现存在缺陷,并且没有公开所需的元数据。

解决方案:根据下面接受的答案,我提出了以下解决方案:

1)从SP ListData.svc端点生成服务引用 - 从而创建edmx和代理类。

2)在我的存储库中扩展ContextProvider并覆盖BuildJsonMetadata,如下所示:

protected override string BuildJsonMetadata()
{
    XDocument xDoc = XDocument.Load(HttpContext.Current.Server.MapPath("PATH_TO_EDMX"));
    String xString = xDoc.ToString();
    xString = xString.Replace("DATA_SERVICE_NAMESPACE", "APP_NAMESPACE");
    xDoc = XDocument.Parse(xString);
    var jsonText = CsdlToJson(xDoc);
    return jsonText;
}

3)稍微修改breeze.js,编辑第12383行:

var schema = metadata.schema || metadata["edmx:Edmx"]["edmx:DataServices"].schema;

(我可以通过选择一个后代而不是我的xDoc的根节点来修复它在ContextProvider中)

4) - 可选择使用@Christoff非常有用的T4TS.tt模板脚本从服务代理类生成d.ts,这样我就可以对轻松加载的数据进行类型安全。

到目前为止,使用此设置非常好 - 我可以使用元数据执行基本CRUD,并以SP作为数据源支持。

1 个答案:

答案 0 :(得分:3)

v 1.2.7 开始,我们记录了Breeze的元数据架构,现在,Breeze将遵循从您的Web服务返回的遵循此架构的json对象。

---以下帖子

我们正在记录如何在接下来的一周内公开任意服务器端元数据,之后不久将通过一些如何使用任意Web服务的示例。还涉及一些小的代码更改。

目前,在这些文档完成之前,最佳解决方法是在客户端上创建元数据并使用jsonResultsAdapter将服务调用的结果整形为“实体”。您在客户端上创建的元数据将与您最终将在服务器上创建并发送到客户端的元数据完全相同。

希望这有帮助。