我想使用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數據庫?
你所要求的是可能的,但它是搞砸了。首先,你不應該通過Web服務傳遞數據庫對象 - 客戶端不需要知道數據庫的實現。對於兩種情況,您絕對不應該常規更改數據庫模式,尤其是不要每天多次更改數據庫模式。 – 2011-04-13 00:28:57
不過,我只是用這個例子來說明問題。實際上,客戶端實際上並不知道(或關心)對象的存儲方式,而架構實際上並沒有經常改變這種情況,但我想指出重新編譯不是一個實際的選擇。 – 2011-04-13 03:56:31
所以,現在你嘲笑我:我將如何去解決這個問題?我不懷疑它是因爲我無法使用傳統方法解決它而搞砸了。 – 2011-04-13 03:57:46