Subsonic - как использовать имя схемы / владельца SQL как часть пространства имен?
Я только начал использовать Subsonic 2.2 и до сих пор очень впечатлен - думаю, это сэкономит мне серьезное время кодирования.
прежде чем я нырну в использование его полный рабочий день, хотя есть что-то беспокоит меня, что я хотел бы разобраться.
в моей текущей базе данных (БД SQL2008) я разделил таблицы,представления, sps и т. д. до отдельных кусков по имени схемы / владельца, поэтому все таблицы клиентов находятся в клиенте. схема, продукты в продукте. схемы и т. д. так, чтобы выбрать из таблица адресов клиентов я бы сделал select * from customer.адрес
к сожалению, Subsonic игнорирует имя схемы / владельца и просто дает мне имя базовой таблицы. Это нормально, поскольку у меня нет дубликатов между схемами (e.G клиент.Адрес и поставщик.Адрес не существует), но я просто чувствую, что код может быть яснее, если я могу разделить по схеме.
В идеале я хотел бы иметь возможность изменять пространство имен по схеме / владельцу - я думаю, что это будет иметь наименьшее влияние на дозвуковой еще сделайте полученный код более легким для чтения.
проблема в том, что я прополз по всему Дозвуковому источнику и не знаю, как это сделать (не помогает, что я кодирую в VB не c# = да, я знаю, виноват спектр ZX!!)
Если кто-то занимался этим раньше или имеет представление о том, как его решить, я был бы очень благодарен,
спасибо заранее.
Эд
4 ответов
Я собирался предложить подход с несколькими поставщиками. Но большая часть сантехники уже находится в дозвуковом состоянии. Если вы отредактируете пару строк в CS_ClassTemplate.aspx можно создать пространство имен для каждого профиля владельца. Изменение вокруг строки 58 (я использую v2.1) to
namespace <%=provider.GeneratedNamespace%><%=owner%>
, где собственником является
string owner = "." + tbl.SchemaName;
if(owner == ".dbo")
owner = "";
вы поместите это выше, вокруг строки 14. Таким образом, вы можете иметь пространство имен для каждого владельца, как: "Борей".Поставщики, Нортвинд.Клиентов и т. д. Я ушел. dbo как просто Northwind, поэтому все тесты будут компилироваться без большого редактирования. Я запустил простой запрос выбора, и я думаю, что он будет работать так, как вы хотите.
вы можете сделать это в 3.0, а также с помощью наших шаблонов T4 (но это только 3.5). Это действительно хорошая обратная связь - мы должны построить это по умолчанию, возможно!
рад, что вы получили некоторую помощь здесь.
просто, чтобы вы знаете, у меня это сейчас работает - или, по крайней мере, компиляция! :- ) Чтобы решение владельца работало полностью, хотя вам нужно будет внести больше изменений в шаблон класса, поскольку в противном случае функции таблицы/ключа находятся в неправильном пространстве имен.
Я также взломал шаблон хранимой процедуры. Я не мог (за короткое время) разработать, как разделить на отдельные файлы / пространства имен для каждого владельца, поэтому вместо этого я префикс каждой функции sp с владельцем и подчеркивание.
однако, если у вас есть та же проблема, вы будете знать, что ее можно исправить.
Эд
вы можете попробовать сделать отдельных поставщиков, которые имеют одно и то же базовое соединение с базой данных, например:
<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. Вы сказали, что у вас нет дубликатов имен таблиц на разных схемах, поэтому это может сработать.