Как динамически добавить таблицу в контекст EF4 в коде - сначала нет кода - PullRequest
0 голосов
/ 18 февраля 2011

Мы запускаем серию отчетов каждые 6 месяцев и сохраняем результаты в таблицах, которые можно запрашивать / просматривать в любое время в будущем.В зависимости от цикла будут добавлены две или четыре таблицы.У них есть стандартное соглашение об именах yyyy_mmm_Table_x.

Наш веб-сайт построен с использованием ASP.Net MVC2, а база данных моделируется с использованием EF4 с использованием стандартного конструктора моделей, а не Code First.

Я бы хотелчтобы иметь возможность динамически добавлять таблицы отчетов в контекст EF4 во время выполнения.Я не хочу вручную добавлять их в модель, используя конструктор, в противном случае каждый цикл отчетности мы должны обновлять и перекомпилировать модель только потому, что мы добавили дополнительные отчеты.Это было бы головной болью при обслуживании, когда ничего не изменилось.

Я могу получить список доступных таблиц, просто запросив sysobjects.Если бы я мог получить этот список и добавить таблицы в контекст при запуске сайта, то я мог бы использовать что-то вроде библиотеки Dynamic LINQ для запроса к ним в зависимости от того, какую таблицу выбрал пользователь из выпадающего списка.

Я не могу использовать код EF4 сначала из коробки, потому что это заставит меня создавать конкретные классы для таблиц, и это будет та же самая головная боль при обслуживании.Я подозреваю, что мог бы использовать те же стратегии, что и в среде Code First, для динамического обновления контекста, но я вообще не смотрел на эту библиотеку и надеюсь, что кто-то, знакомый с ней, может указать мне правильное направление.

В противном случае я думаю, что мне пришлось бы вернуться в ADO.Net для обработки этой области.Это может быть лучший и простой способ, поэтому я думаю, что я ищу комментарии.Я не фанат, поэтому мне не нужно все, чтобы быть в LINQ и EF4.:) Но это может показаться немного чище и последовательнее, особенно если это позволяет мне использовать Dynamic LINQ.Но иногда старый способ просто проще.

Так что, если у вас есть какие-либо предложения или комментарии, я хотел бы их услышать.

Спасибо!

1 Ответ

0 голосов
/ 18 февраля 2011

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

Все отображения времени выполнения хранятся в MetadataWorkspace, подготовленном EntityConnection. Так что если вы хотите поиграть с ним, вы можете начать с него, но общедоступные интерфейсы этих классов не выглядят многообещающими.

Полагаю, вы хотите запустить Linq-to-entity для этих таблиц, поэтому использование хранимой процедуры, возвращающей данные из правильной таблицы на основе параметра data, вероятно, не вариант.

Для этого вы должны использовать общий ADO.NET.

...