2009-04-16 19 views
6

Ho appena iniziato ad usare Subsonic 2.2 e fino ad ora sono rimasto molto colpito - penso che mi farà risparmiare un po 'di tempo per programmare seriamente.Subsonic - Come utilizzare lo schema SQL/nome proprietario come parte dello spazio dei nomi?

Prima di immergermi nel suo utilizzo a tempo pieno anche se c'è qualcosa che mi infastidisce che mi piacerebbe risolvere.

Nel mio database corrente (un db SQL2008) ho diviso le tabelle, le viste, le ecc. Ecc. In blocchi separati per schema/nome proprietario, quindi tutte le tabelle clienti sono nel cliente. schema, prodotti nel prodotto. schema ecc, quindi a selezionare dalla tabella degli indirizzi dei clienti farei una selezione * da customer.address

Sfortunatamente, Subsonic ignora il nome schema/proprietario e mi dà solo il nome della tabella di base. Questo va bene perché non ho duplicati tra gli schemi (ad esempio, Customer.Address e Supplier.Address non esistono entrambi) ma sento che il codice potrebbe essere più chiaro se potessi dividere per schema.

Idealmente mi piacerebbe essere in grado di modificare lo spazio dei nomi in base allo schema/proprietario - Penso che questo abbia un impatto minore su SubSonic, ma rendere il codice risultante più facile da leggere.

Il problema è che ho scansionato tutta la sorgente Subsonic e non ho idea di come farlo (non aiuta il codice in VB non C# = sì lo so, incolpare ZX Spectrum !!)

Se qualcuno ha affrontato questo prima o ha un'idea su come risolverlo, sarei davvero grato,

Grazie in anticipo.

Ed

risposta

6

Stavo per suggerire l'approccio con più provider. Ma molti degli impianti idraulici sono già in subsonico per la proprietà. Se si modificano un paio di righe in CS_ClassTemplate.aspx, è possibile creare uno spazio dei nomi per ciascun profilo del proprietario. Cambio intorno alla linea 58 (sto usando v2.1) per

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

cui proprietario è

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

metti che in alto, intorno alla linea 14. In questo modo si può avere uno spazio dei nomi per ogni proprietario come: Northwind.Suppliers, Northwind.Customers, ecc. Ho lasciato dbo come solo Northwind in modo che tutti i test fossero compilati senza un sacco di modifiche. Ho eseguito una query di selezione semplice e penso che funzionerà nel modo desiderato.

+0

Devi anche modificare un po 'il generatore ODSController e Structs, ma è molto semplice. –

+0

Ho una situazione simile. Tuttavia è ulteriormente complicato dall'avere tabelle con lo stesso nome in schemi diversi. C'è un modo per aggirarlo? – Muxa

1

Si potrebbe provare a fare provider separati che hanno la stessa connessione al database sottostante, in questo modo:

<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> 

Non credo che si può usare lo schema in sé come una chiave in questo modo , ma potresti almeno risolvere il problema con una combinazione di includeTableList e generateNamespace. Hai detto che non hai nomi di tabelle duplicati tra i diversi schemi, quindi potrebbe funzionare.

+0

Ciao, grazie per la rapida risposta :-) Ho 6 schemi in totale che vanno dal molto usato alla luce (roba di configurazione) uso. Un po 'preoccupato per 6 connessioni separate allo stesso db. Ragazzino nella parte posteriore della mia testa dicendo che questa è una cattiva idea, ma non è sicuro .. – CResults

1

Giusto per farvi sapere che ora funziona - o almeno, la compilazione! :-) Per fare in modo che la soluzione proprietaria funzioni completamente, è necessario apportare ulteriori modifiche al modello di classe, altrimenti le funzioni tabella/tasto si trovano nello spazio dei nomi errato.

Ho anche violato il modello di procedura memorizzato.Non potevo (nel poco tempo che ho) capire come dividere in file/namespace separati per ciascun proprietario, quindi ho anteposto ogni funzione sp con il proprietario e un trattino basso.

Tuttavia, nel caso abbiate lo stesso problema, saprete che è possibile correggerlo.

Ed

3

Si potrebbe fare questo in 3.0 e utilizzando i nostri modelli di T4 (ma è solo 3.5). Questo è davvero un bel po 'di feedback - dovremmo costruirlo di default forse!

Felice di avere qualche aiuto qui.

Problemi correlati