Динамическая схема SubSonic: SelectList - PullRequest
0 голосов
/ 23 марта 2009

Сценарий

Я использую SubSonic для моего последнего проекта. Обо всем по порядку; этот проект ограничен использованием .net 3.0, и SubSonic был ОТЛИЧНЫМ. Я люблю это.

Однако у меня возникли проблемы с настройкой. Заказчик попросил нас использовать две базы данных SQL Server 2005, одна из которых будет реплицировать другую, за исключением некоторых столбцов.

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

Например, следующий код справится с задачей, но я бы предпочел не делать это каждый раз, когда я создаю новый запрос:

Query q = Post.Query().WHERE(Post.Columns.PageId, page_id);
if(UsingReplicatedDB)
    q.SetSelectList(ReplicatedPostColumnList);
return q.ExecuteReader();

Вопрос

Вышеуказанный метод раздувает мой код и не работает для встроенных FetchByX методов, генерируемых SubSonic. Есть ли способ элегантно установить по умолчанию SelectList для каждой таблицы?

Примечания

Я пытался удалить столбцы из схемы во время выполнения в моих частичных классах, но столбцы, выглядящие как ColNameColumn, ищут определенные индексы в коллекции Columns, поэтому мой план был сорван.

Я знаю, я знаю

Пожалуйста, нет "Ты идиот, зачем ты это делаешь?" ответы. Я понимаю, что, скорее всего, есть более удачные способы, и это кажется немного хакерским, но в этом-то и дело. Мне нужно решение, не придирчивое.

Ответы [ 3 ]

2 голосов
/ 23 марта 2009

Я не думаю, что есть простой способ заставить это работать. Можно создать двух поставщиков SubSonic, указывающих на каждую БД, а затем, в зависимости от ситуации, использовать объекты SubSonic для заполнения отдельной модели. Но SubSonic не работает так, как вы хотите, поскольку он так тесно связан со схемой БД.

0 голосов
/ 13 апреля 2009

, если вы открыты для использования 3.0 (который скоро будет выпущен), я был бы рад поработать с вами над некоторыми исправлениями шаблона TT, которые будут делать именно это (игнорируйте столбцы повторений). Пинг меня на моем имени в Gmail - я давно хотел это сделать:).

3.0 также позволит вам использовать Linq и наш инструмент neq Query - но я бы хотел быть уверенным, что он не нарушит вашу работу.

0 голосов
/ 13 апреля 2009

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

Я бы порекомендовал использовать два SubSonic Provider, а затем иметь класс Generated, каждый из которых реализует интерфейс, содержащий свойства для столбцов, общих для двух классов, а также Subsonic Methods, которые вы планируете использовать для взаимодействия с вашей базой данных, например как Сохранить ();.

Иногда, когда вы хотите настроить что-то, чтобы работать так, как вы хотите, чтобы это работало, вам нужно написать какой-нибудь специальный код:)

...