如何在不使用EF的情况下向实体添加上下文元数据?
How can I add context metadata to my entities without using EF?
我必须实现一个架构,不幸的是,我们使用SharePoint 2013作为我们的主要数据库。(这不是我的选择,如果你没有注意到的话)。我有一个Asp。服务器端的asp.net MVC facade应用程序,处理来自SP和其他几个数据源的数据组合,然后是一个JavaScript SPA作为客户端。另一个问题是,客户机需要能够脱机工作,因此我需要使用IndexedDB来存储用于脱机访问的数据。
这似乎是breeze.js的完美用例。我的基本架构是在MVC facade中定义一个强类型模型,它将包装我从SP获得的非类型数据(以object["property"]的形式-使用SP客户端对象模型)。Breeze将处理这个模型和客户端之间的同步,我将使用导出/导入功能在IndexedDB中缓存数据。
到目前为止一切顺利。但是…breeze站点上的SOA示例仍在开发中(对我来说,这基本上是一个SOA体系结构,每个SP List都包含一个要组合的服务)。我能找到的最接近的东西是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。从服务代理类生成d.ts,这样我就可以对breeze加载的数据具有类型安全。
到目前为止,这个设置很好-我可以使用元数据执行基本的CRUD,由SP作为数据源支持。
作为v 1.2.7,我们已经记录了Breeze的元数据模式,并且从您的webservice返回的遵循此模式的json对象现在将被Breeze所尊重。
—下一篇文章
在接下来的一周左右的时间里,我们将记录如何公开任意服务器端元数据,随后将提供一些如何使用任意web服务的示例。还涉及到一些小的代码更改。
目前,在这些文档完成之前,最好的解决方法是在客户端上创建元数据,并使用jsonResultsAdapter将服务调用的结果塑造为"实体"。您在客户机上创建的元数据将与您最终在服务器上创建并发送给客户机的元数据完全相同。
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在映射数组中添加换行符
- 正在将数据主题添加到所有项目
- ZeroClipboard-在复制之前添加到值
- 我可以在json对象中添加一个函数吗
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 正在SharePoint 2013母版页中添加JQuery移动文件
- 如何在C#MVC/Javascript中的运行时添加一个空实体
- 添加角度实体化的依赖项时出错
- Box2DWeb-世界上添加和删除实体
- 根据状态添加实体类的角度
- 如何将选择列表添加到自定义实体的案例表单中(注意:替换普通查找字段)
- breezejs:向实体类型添加引用约束
- 使用javascript将html实体添加到按钮文本中
- 将billboardCollection添加到铯中的实体中
- 将数字标识符中的字符实体添加到输入值中
- 如何安全地添加或删除实体与breezejs
- 如何在不使用EF的情况下向实体添加上下文元数据?
- 有没有办法通过OData v4中的一个PATCH请求来更新实体属性并添加对它的引用
- Symfony2表单实体添加其他选项