2011-09-08 36 views
2

說我有以下的模型的OData訂閱

Two OData Feeds from two databases

我想目前這些OData的統一前饋送給我的客戶。

OData是否有一個很好的方法來做到這一點?或者我應該從OData提要中獲取IQueryables,並在這些提要上製作一個反射端點?

如果我在與數據庫交談的OData之上使用反射內容(通過實體框架),我會遇到什麼樣的問題?

+0

您是否希望用戶能夠通過單個URL訪問數據 - 例如「http:// server/Entities.svc/User」和「http:// server/Entities.svc/Customer」,其中用戶在DB1上,而客戶來自DB2?實體是否被數據庫隔離,還是跨越數據庫?我想我很想知道你想在這裏完成什麼。 –

+0

@David - 你完全正確。我想在單個OData端點中提供來自兩個不同數據庫的實體。我們的想法是讓我的客戶不必知道他們必須去查找特定數據的端點列表。 (實際上會有超過2個數據庫。) – Vaccano

回答

2

我不會在客戶端庫上使用反射提供程序,主要是因爲客戶端庫LINQ提供程序不支持服務器使用的所有構造。因此,一些查詢根本不起作用(預測和擴展通常會被破壞)。 假設您不想在數據庫之間創建任何關聯,您應該能夠簡單地將用戶指向正確的服務。您仍然可以展示看起來像統一端點的內容,而無需爲所有端點使用相同的URL。

主要思想是統一$元數據(如果你的模型是靜態的,你可以手動完成,如果不是,你應該可以很容易地編寫某種「合併」工具),然後提供一個服務文檔它指向每個實體集的相應URL。 http://blogs.msdn.com/b/astoriateam/archive/2010/11/29/entity-set-resolver.aspx 與支持最新的CTP是在這裏:http://blogs.msdn.com/b/astoriateam/archive/2011/06/30/announcing-wcf-data-services-june-2011-ctp-for-net4-amp-sl4.aspx

+0

我需要與Vaccano相同的功能。如果使用OData公開的相同模式(=端點數量)的數據庫數量是動態的(意味着可以即時創建新數據庫並使用新的OData端點公開此數據庫,那麼您會做什麼?需要客戶端能夠訪問這個新創建的數據庫,而不需要重啓服務器。是否有可能?我真的需要一個OData端點用於每個新數據庫嗎?如果我有10個數據庫,那麼它太多了開銷有10個OData端點? –

0

不滿意這個問題目前接受的答案,對我來說這在WCF數據服務客戶端,現在有這些類型的服務,通過實體設置變壓器支承更多的是反對,而不是做什麼。我的解決方案在今天的應用方式與'11

一樣適用於支持租戶方案,其中每個用戶/客戶端數據總是駐留在同一個數據庫中,並且數據方案都匹配,那麼您所需要做的就是數據上下文實例化時更改連接字符串。

的另一個術語這一概念是拆分,MS有一些工具和API,可以幫助,這是一個很簡單的演練:Azure SQL Database Elastic database tools: Shard Elasticity但你可以從第一校長做到這一點很容易地。

如果換出的連接字符串將您的方案的工作,我們需要確定你會用它來確定連接字符串的機制,常見的有兩種解決方案,以這樣的:

  1. 簡單出路在於使用固定的主機頭,每個請求中的路由或令牌,然後您可以硬編碼確定連接字符串的邏輯,而無需複雜的映射邏輯。

  2. 使用主/頭/映射數據庫來存儲您的配置。

    該數據庫有一個單獨的模式,主要目的是爲每個請求檢索正確的連接字符串。 在大多數情況下,我們將其與驗證過程結合使用,在這種情況下,您將驗證保留在此中央數據庫中,而不是在單個數據庫中。

在OData的控制器,即使WCF數據服務方面,你只需要實現你的邏輯檢索連接字符串和使用,當你實例化你的數據上下文。

當然,如果您的客戶端數據分佈在多個數據庫中,這並不會對您有所幫助,但它是一種非常常見的模式,用於在不必爲每個數據庫部署新的服務器場的情況下查找大型數據庫。