gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:30:27 30 4
gpt4 key购买 nike

我想使用 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 提要,从而导致以下“请求错误”:

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 Untyped Data Provider 的示例实现,可以轻松修改它以返回元数据和表数据。

关于c# - WCF 数据服务的动态实体模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5642846/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com