Отображение класса POCO в динамически создаваемые таблицы - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть скрипт, работающий каждый час, который сохраняет данные журнала в базе данных журналов.Каждый месяц создается новая таблица, и информация о регистрации за этот месяц сохраняется в этой таблице.

Каждая создаваемая таблица идентична и соответствует простому классу POCO

class IISLog
{
  SystemRef,
  date,
  s-sitename,
  //etc
 }

IМы нашли только один способ доступа к этим таблицам с использованием подхода, основанного на коде:

 var result = this.Database.SqlQuery<WebLog>("select * from " + table + "_" + month);

Однако, похоже, я теряю ленивую загрузку в процессе, поскольку SqlQuery возвращает IEnumerable типа.

Есть ли способ позволить ленивой загрузке преобладать, а также позволить контексту данных отслеживать элементы?(Главный приоритет по первому пункту).

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Вы потеряете все, используя SqlQuery - это прямое выполнение SQL без каких-либо задействованных функций EF.Он просто материализует объекты для вас.

Невозможно использовать EF с таблицами базы данных этого типа.EF требует, чтобы тип мог быть сопоставлен только с одной таблицей (или набором таблиц в случае наследования или разделения).Объект не может быть сопоставлен с несколькими таблицами, даже если они абсолютно одинаковы.

Если вы хотите использовать EF, вам следует искать решение на стороне базы данных и сопоставлять только одно представление базы данных или таблицу с вашей сущностью или использовать хранимую процедуру для правильного выбора таблицы, которая будет запрашиваться.

0 голосов
/ 30 сентября 2011

Я думаю, что это очень возможно. Конечно, я не разработал его, но здесь я бы начал. Сначала вы можете сделать два запроса, чтобы найти основную информацию о вашей базе данных:

SELECT * FROM INFORMATION_SCHEMA.TABLES
SELECT * FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = 'MyTableName'

РЕДАКТИРОВАТЬ: Из этого цикла вы получите список таблиц и их соответствующих атрибутов. Вам может не понадобиться этот шаг, если вы используете соглашение поверх конфигурации.

Отсюда вы можете создавать свои пользовательские объекты во время выполнения, используя отражения TypeBuilder и FieldBuilder. Примером будет http://mironabramson.com/blog/post/2008/06/Create-you-own-new-Type-and-use-it-on-run-time-%28C%29.aspx.

Затем используйте EF Code First с пользовательским DbContext и переопределите OnModelCreating (...) для отображения ваших динамических объектов. Используя Fluent API, вы можете перебирать динамические типы для создания повторяющегося шаблона отображения. Однако будьте осторожны, чтобы не выполнять этот шаг при каждом создании. Я думаю, что это может быть суть вашей проблемы.

Тем не менее я очень заинтригован вашим вопросом и мне интересно, каково ваше конечное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...