ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-08 14:16:02  阅读:479  来源: 互联网

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


我想使用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类添加属性的方法,以便它可以表示查询时所存在的数据库表的形状.

例如,假设数据库包含一个名为“人口”的表,我希望能够支持以下OData查询:

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

其中Code是包含美国州代码的char(2)列.

到目前为止,任何尝试使用ExpandoObject(而不是Table类)或让Table类从DynamicObject派生的尝试都未能创建可行的OData feed,从而导致以下“请求错误”:

The exception message is ‘Internal Server Error. The type ‘ServiceLibrary.Table’ is not supported.’

堆栈跟踪显示抛出异常

System.Data.Services.Providers.ReflectionServiceProvider.BuildHierarchyForEntityType

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

解决方法:

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

标签:dynamic,odata,wcf,c,wcf-data-services
来源: https://codeday.me/bug/20191208/2092114.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有