我必須實施一種架構,不幸的是,我們正在有效地將SharePoint 2013用作我們的主數據庫。 (不是我的選擇,如果你沒有選擇的話)。我在服務器上有一個Asp.Net MVC Facade應用程序,處理來自SP和一些其他數據源的數據組合,然後以JavaScript作爲客戶端。另外一個問題是客戶端需要能夠離線工作,所以我需要使用IndexedDB來存儲離線訪問的數據。如何在不使用EF的情況下將上下文元數據添加到我的實體? [已解決]
這似乎是breeze.js的完美用例。我的基本體系結構是在MVC外觀中定義一個強類型模型,它將使用SP客戶端對象模型將從SP獲得的非類型化數據(在表單對象[「property」]中包裝)。 Breeze將處理此模型和客戶端之間的同步,並且我將使用導出/導入功能根據需要在IndexedDB中緩存數據。
到目前爲止這麼好。但是...微風網站上的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選擇後代而不是根節點來解決此問題)
4) - 可選地使用@ Christoff的非常有用的T4TS.tt模板腳本從服務代理類生成一個d.ts,所以我可以對微風載入的數據進行類型安全。
到目前爲止這個設置非常好 - 我可以使用元數據執行基本的CRUD,由SP作爲數據源支持。
周杰倫 - 謝謝你的迴應。我可以花上一個星期左右的時間,直到文檔準備就緒,但只是失敗的機會:我從服務引用中獲得了'edmx' - 是否有任何方法可以使用DbContext的insead? – JcFx 2013-03-19 17:37:30
如果您查看EFContextProvider類中的源代碼,則可以使用GetCsdlFromDbContext方法中的代碼從edmx中提取碎片以構建json元數據結構。希望這可以幫助。 – 2013-03-19 20:14:46
我來看看。非常感謝。 – JcFx 2013-03-19 20:17:03