2013-08-27 74 views
0

我使用breeze從MVC 4應用程序中的遠程SQL Server數據庫加載一些數據。該數據庫有大約40個實體。用微風加載元數據需要很多時間:大約14s到35s之間,儘管尺寸並不大:〜600kb。用微風加載元數據很慢

加載元數據後,實體獲取速度要快得多。例如2.5 Mb的實體在2.5s內加載。

https://www.dropbox.com/s/n8eqv5ezqr1qqlp/loading.png

我的問題是:

是否有一個原因,爲什麼這個加載慢,什麼將減少加載時間的方法嗎?

+0

從它的接縫的問題是在服務器上的截圖。如果這需要這麼長時間,那麼你可以在服務器上實現一些緩存機制。檢查第二個客戶端獲取元數據需要多長時間。 – pawel

+0

我試圖用第二個客戶端獲取數據,但時間相同。我想也許有一種方法可以將元數據存儲在應用程序中的文件中,這樣我就可以避免對服務器的調用。 – razvanz

+0

您可以將它作爲字符串存儲在靜態字段中。 – pawel

回答

2

我很少問服務器的元數據,一旦我走了。我快速從EntityManager的元數據存儲中導出元數據,並將其作爲全局變量轉儲到JavaScript文件中。我將其與我的其他腳本包含在我的index.html中。我在啓動時將此var加載到我的經理的metadateStore中。

隨着時間的推移,我越來越複雜,在服務器啓動時自動重新生成,序列化並將其存儲在瀏覽器本地存儲等中。一旦您意識到元數據只是一個JS對象,您就可以永遠保持密鑰。聰明。

+0

感謝@Ward的答案。我也得出了這個結論,因爲數據庫結構不會改變,我把元數據作爲一個字符串保存到應用程序中正如我之前所說的,在我深入研究這個問題之後,我發現獲取元數據並不是那麼慢,而是實體框架的初始化,我使用實體框架5現在閱讀[this](http://entityframework.codeplex.com/discussions/396130)我正在考慮將EF升級到版本6 rc1。微風支持這個版本嗎? – razvanz

+0

Breeze。包含EFContextProvider的網絡尚未轉換或測試尚未發佈的EF6。它可能會在某些已經改變的地方旅行。一般來說,我們不打擾MS產品即將發佈。我們處理和支持的流失太多了。 – Ward

+0

@Ward:你有一個如何手動設置元數據的代碼示例,以便它不會嘗試從服務器加載它?我試圖使用'const metadataStore:MetadataStore = MetadataStore.importMetadata(元數據); const entityManagerConfig:EntityManagerOptions = { serviceName:「http:// localhost:63553」, metadataStore:metadataStore }; this.entityManager = new EntityManager(entityManagerConfig);',但它在執行查詢時仍會對元數據進行HTTP調用。請指教。 –

1

您可以避免在從服務器單獨的網絡調用中加載元數據的需求,方法是將其嵌入到腳本中,並按照@Ward提供的方式手動爲它提供Breeze。

下面是(我使用下面的打字稿):

import { DataService, EntityManager, MetadataStore, NamingConvention } from "breeze-client"; 

     // Your metadata object 
     const metadata: any = Metadata.value; 

     // define the Breeze `DataService` for this app 
     const dataService: DataService = new DataService({ 
      serviceName: "http://localhost:63000", 
      hasServerMetadata: false // don't ask the server for metadata 
     }); 

     // create the metadataStore 
     const metadataStore: MetadataStore = new MetadataStore({ 
      namingConvention: NamingConvention.camelCase // if you use this convention 
     }); 

     // initialize it from the application's metadata variable 
     metadataStore.importMetadata(metadata); 

     const entityManagerConfig: EntityManagerOptions = { 
      dataService: dataService, 
      metadataStore: metadataStore 
     }; 

     this.entityManager = new EntityManager(entityManagerConfig); 

現在你有一個EntityManager實例與元數據並準備執行查詢初始化。

更多PVC門,看到official docs