2011-04-12 59 views
3

我想使用WCF數據服務將SQL數據庫的內容公開爲OData提要。WCF數據服務的動態實體模型

只要SQL數據庫模式不變,一切都可以正常工作。一旦添加了數據庫表已更改實體模型已過期。重新編譯數據服務不是一種選擇,因爲模式可以每天更改多次。

我定義表中的數據服務:

public class TablesDataService 
{ 
    private static List<Table> _tables; 

    static TablesDataService() 
    { 
     _tables = new List<Table>(); 
     // query the database and add a table entity model for each table 
    } 

    public IQueryable<Table> Tables 
    { 
     get { return _tables.AsQueryable<Table>(); } 
    } 
} 

其中使用以下POCO來表示一個單獨的表中:

[DataServiceKey("Name")] 
public class Table 
{ 
    public Table(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 

WCF數據服務使用用於WcfDataService.svc以下類:

public class WcfDataService : DataService<TablesDataService> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
     config.SetEntitySetAccessRule("Tables", EntitySetRights.All); 
    } 
} 

因爲SQL數據庫中的每個表都有不同的集合的列,我正在尋找一種方法來動態添加屬性到Table類,以便它可以表示查詢時存在的數據庫表的形狀。

例如,假設數據庫包含一個稱爲人口的表,我想能夠支持以下的OData查詢:

http://localhost/WcfDataService.svc/Tables('Population')?$filter=Code eq 'CA' 

其中代碼是char(2)含有與美國狀態柱碼。

到目前爲止,使用的任何企圖任一種ExpandoObject(代替表類),或具有表類從DynamicObject派生未能創造一個可行OData源,導致下面「請求錯誤」:

異常消息是'內部服務器錯誤。不支持'ServiceLibrary.Table'類型。'

與表示異常的堆棧跟蹤內部

System.Data.Services.Providers.ReflectionServiceProvider.BuildHierarchyForEntityType 

被拋出有一種方法來創建暴露屬性(表示相應的數據庫表的列)的表類動態可用於由WCF數據服務來瀏覽一個SQL數據庫?

+0

你所要求的是可能的,但它是搞砸了。首先,你不應該通過Web服務傳遞數據庫對象 - 客戶端不需要知道數據庫的實現。對於兩種情況,您絕對不應該常規更改數據庫模式,尤其是不要每天多次更改數據庫模式。 – 2011-04-13 00:28:57

+0

不過,我只是用這個例子來說明問題。實際上,客戶端實際上並不知道(或關心)對象的存儲方式,而架構實際上並沒有經常改變這種情況,但我想指出重新編譯不是一個實際的選擇。 – 2011-04-13 03:56:31

+0

所以,現在你嘲笑我:我將如何去解決這個問題?我不懷疑它是因爲我無法使用傳統方法解決它而搞砸了。 – 2011-04-13 03:57:46

回答

3

OData Provider Toolkit包含R/W非類型化數據提供程序的示例實現,它可以很容易地修改爲返回元數據和表數據。

相關問題