【问题标题】:Dynamic Entity Model for WCF Data ServiceWCF 数据服务的动态实体模型
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多