【发布时间】:2011-04-12 23:36:51
【问题描述】:
我想使用 WCF 数据服务将 SQL 数据库的内容公开为 OData 提要。
只要 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 类添加属性,以便它可以表示查询时存在的数据库表的形状.
例如,假设数据库包含一个名为 Population 的表,我希望能够支持以下 OData 查询:
http://localhost/WcfDataService.svc/Tables('Population')?$filter=Code eq 'CA'
其中 Code 是包含美国州代码的 char(2) 列。
到目前为止,使用 ExpandoObject(而不是 Table 类)或从 DynamicObject 派生 Table 类的任何尝试都未能创建可行的 OData 提要,从而导致以下“请求错误”:
异常消息是“内部服务器错误。不支持“ServiceLibrary.Table”类型。'
堆栈跟踪显示内部抛出的异常
System.Data.Services.Providers.ReflectionServiceProvider.BuildHierarchyForEntityType
有没有办法创建一个 Table 类来动态公开属性(表示相应数据库表的列),WCF 数据服务可以使用它来浏览 SQL 数据库?
【问题讨论】:
-
你所要求的是可能的,但它搞砸了。一方面,您不应该通过 Web 服务传递数据库对象 - 客户端不需要了解数据库实现。对于两个,您绝对不应该定期更改数据库架构,尤其是一天不要多次。
-
所有优点,但是,我只是用这个例子来说明问题。实际上,客户端实际上并不知道(或关心)对象是如何存储的,并且架构实际上并不经常更改这一点,但我想指出重新编译不是一个实际的选择。
-
既然你取笑了我:我将如何解决这个问题?我不怀疑它搞砸了,因为我无法使用常规方法解决它。
-
也许新发布的允许继承的WCF数据服务CTP可以解决这个问题?
标签: c# wcf dynamic wcf-data-services odata