Subsonic - как использовать схему SQL / имя владельца как часть пространства имен?

Я только начал использовать Subsonic 2.2 и пока очень впечатлен - думаю, это сэкономит мне серьезное время на кодирование.

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

В моей текущей базе данных (база данных SQL2008) я разделил таблицы, представления, sps и т. Д. На отдельные фрагменты по схеме / имени владельца, поэтому все таблицы клиентов находятся в клиенте. схема, продукты в продукте. схема и т. д., поэтому для выбора из таблицы адресов клиентов я бы сделал select * from customer.address

К сожалению, Subsonic игнорирует имя схемы / владельца и просто дает мне имя базовой таблицы. Это нормально, поскольку у меня нет дубликатов между схемами (например, Customer.Address и Supplier.Address не существуют), но я просто чувствую, что код мог бы быть более ясным, если бы я мог разделить по схеме.

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

Проблема в том, что я просмотрел весь источник Subsonic и понятия не имел, как это сделать (не помогает то, что я пишу код на VB, а не на C # = да, я знаю, вините ZX Spectrum !!)

Если кто-то уже занимался этим раньше или имеет представление о том, как это решить, я был бы очень благодарен,

Заранее спасибо.

Ed


person CResults    schedule 16.04.2009    source источник


Ответы (4)


Я также собирался предложить подход с несколькими поставщиками. Но большая часть сантехники уже находится в дозвуковом режиме для владения. Если вы отредактируете пару строк в CS_ClassTemplate.aspx, вы сможете создать пространство имен для каждого профиля владельца. Измените строку 58 (я использую v2.1) на

namespace <%=provider.GeneratedNamespace%><%=owner%>

где владелец

string owner = "." + tbl.SchemaName;
if(owner == ".dbo")
  owner = "";

Вы помещаете это выше, около строки 14. Таким образом, у вас может быть пространство имен для каждого владельца, например: Northwind.Suppliers, Northwind.Customers и т. Д. Я оставил dbo как просто Northwind, чтобы все тесты компилировались без большого редактирования. Я выполнил простой запрос выбора и думаю, что он будет работать так, как вы хотите.

person P a u l    schedule 16.04.2009
comment
Вам также придется немного переделать ODSController и генератор структур, но это очень просто. - person P a u l; 16.04.2009
comment
У меня похожая ситуация. Однако это усложняется еще и тем, что некоторые таблицы имеют одно и то же имя в разных схемах. Есть ли способ обойти это? - person Muxa; 08.04.2010

Вы можете сделать это и в версии 3.0, используя наши шаблоны t4 (но только в версии 3.5). Это действительно хороший отзыв - возможно, нам стоит встроить его по умолчанию!

Рад, что тебе здесь помогли.

person Community    schedule 16.04.2009

Просто чтобы вы знали, что у меня это сейчас работает - или, по крайней мере, компилируется! :-) Чтобы решение владельца работало полностью, вам нужно будет внести больше изменений в шаблон класса, поскольку в противном случае функции таблицы / клавиш будут находиться в неправильном пространстве имен.

Я также взломал шаблон хранимой процедуры. Я не мог (за то короткое время, которое у меня есть) решить, как разделить на отдельные файлы / пространства имен для каждого владельца, поэтому вместо этого я добавил к каждой функции sp префикс владельца и подчеркивания.

Однако на случай, если у вас возникнет такая же проблема, вы будете знать, что ее можно исправить.

Ed

person CResults    schedule 16.04.2009

Вы можете попробовать сделать отдельных поставщиков, которые имеют одно и то же соединение с базой данных, например:

<SubSonicService defaultProvider="DBData">
<providers>
<clear/>
     <add name="DBData" type="Subsonic.SqlDataProvider, SubSonic" connectionStringName="LocalSqlServer" generatedNamespace="DBData" includeTableList="table_a,table_b" spStartsWith="app,get,set" viewStartsWith="v_" />
     <!--CMS Provider-->
     <add name="CMS" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="LocalSqlServer" generatedNamespace="CMS" stripTableText="CMS_" includeTableList="CMS_Content,CMS_Page" useSPs="false"/>
</providers>
</SubSonicService>

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

person Dave Neeley    schedule 16.04.2009
comment
Привет, спасибо за быстрый ответ :-) Всего у меня 6 схем, от интенсивно используемых до легких (конфигурируемых). Немного беспокоило насчет 6 отдельных подключений к одному и тому же БД. Маленький парень в моей голове говорит, что это плохая идея, но не уверен ... - person CResults; 16.04.2009