WCF数据服务的动态实体模型

时间:2011-04-12 23:36:51

标签: c# wcf dynamic wcf-data-services odata

我希望使用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类)或使用TableObject派生自DynamicObject的尝试都无法创建可行的OData源,导致以下“请求错误”:

  

异常消息是“内部服务器错误”。不支持“ServiceLibrary.Table”类型。'

堆栈跟踪显示抛出异常

System.Data.Services.Providers.ReflectionServiceProvider.BuildHierarchyForEntityType

有没有办法创建一个Table类,它动态地公开属性(表示相应数据库表的列),WCF数据服务可以使用它来浏览SQL数据库?

1 个答案:

答案 0 :(得分:3)

OData Provider Toolkit包含R / W无类型数据提供程序的示例实现,可以轻松修改该实现以返回元数据和表数据。