Я хочу предоставить содержимое базы данных SQL в качестве канала OData с помощью службы данных WCF.
Все работает хорошо, пока схема базы данных 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), либо иметь класс Table, производный от DynamicObject, не смогли создать работоспособный канал OData, что привело к следующему «Ошибка запроса»:
Сообщение об исключении: «Внутренняя ошибка сервера. Тип 'ServiceLibrary.Table' не поддерживается. '
с трассировкой стека, показывающей исключение, генерируемое внутри
System.Data.Services.Providers.ReflectionServiceProvider.BuildHierarchyForEntityType
Есть ли способ динамического создания класса Table, который предоставляет свойства (представляющие столбцы соответствующей таблицы базы данных), которые могут использоваться службой данных WCF для просмотра базы данных SQL?