Дозвуковой - Как использовать имя схемы / владельца SQL как часть пространства имен? - PullRequest
6 голосов
/ 16 апреля 2009

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

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

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

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

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

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

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

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

Ed

Ответы [ 4 ]

6 голосов
/ 16 апреля 2009

Я тоже собирался предложить подход с несколькими провайдерами. Но большая часть сантехники уже в дозвуковой собственности. Если вы отредактируете пару строк в 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, чтобы все тесты компилировались без большого редактирования. Я выполнил простой запрос выбора и думаю, что он будет работать так, как вы хотите.

3 голосов
/ 16 апреля 2009

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

Рад, что вы получили помощь здесь.

1 голос
/ 16 апреля 2009

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

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

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

Ред.

1 голос
/ 16 апреля 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 и generateNamespace. Вы сказали, что у вас нет повторяющихся имен таблиц в разных схемах, так что это может сработать.

...