2009-04-16 13 views
6

Je viens juste de commencer à utiliser Subsonic 2.2 et jusqu'à présent, je suis très impressionné - je pense que cela me fera économiser du temps de codage. Avant de plonger dans l'utilisation à temps plein, il ya quelque chose qui me dérange que je voudrais trier.Subsonic - Comment utiliser SQL Schema/Nom du propriétaire dans le cadre de l'espace de noms?

Dans ma base de données actuelle (SQL2008 db), j'ai divisé les tables, vues, sps, etc. en plusieurs parties distinctes par nom de schéma/propriétaire, de sorte que toutes les tables clients se trouvent chez le client. schéma, produits dans le produit. schema etc., donc pour sélectionner dans la table d'adresses des clients je ferais un select * de customer.address

Malheureusement, Subsonic ignore le nom du schéma/propriétaire et me donne juste le nom de la table de base. C'est très bien car je n'ai pas de doublons entre les schémas (par exemple, Customer.Address et Supplier.Address n'existent pas tous les deux) mais je pense simplement que le code pourrait être plus clair si je pouvais séparer par schéma.

Idéalement, j'aimerais pouvoir modifier l'espace de noms par schéma/propriétaire - je pense que cela aurait le moins d'impact sur SubSonic tout en rendant le code résultant plus facile à lire. Le problème est, j'ai rampé partout dans la source Subsonic et n'ai aucune idée de comment faire cela (ne aide pas que je code dans VB pas C# = oui je sais, blâmer le ZX Spectrum !!)

Si quelqu'un a abordé ce avant ou a une idée sur la façon de le résoudre, je serais vraiment reconnaissant,

Merci à l'avance.

Ed

Répondre

6

J'allais suggérer l'approche du fournisseur multiple aussi. Mais une grande partie de la plomberie est déjà en subsonic pour la propriété. Si vous modifiez quelques lignes dans CS_ClassTemplate.aspx, vous pouvez créer un espace de noms pour chaque profil de propriétaire. Changement autour de la ligne 58 (j'utilise v2.1) pour

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

où le propriétaire est

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

Vous mettez au-dessus que, autour de la ligne 14. De cette façon, vous pouvez avoir un espace de noms pour chaque propriétaire comme: Northwind.Suppliers, Northwind.Customers, etc J'ai laissé dbo comme juste Northwind afin que tous les tests compileraient sans beaucoup d'édition. J'ai lancé une simple requête de sélection et je pense que cela fonctionnera comme vous le souhaitez.

+0

Vous devez également modifier le générateur ODSController et Structs un peu, mais c'est très facile. –

+0

J'ai une situation similaire. Cependant, il est compliqué par le fait que certaines tables ont le même nom dans différents schémas. Y a-t-il un moyen de contourner cela? – Muxa

1

Vous pouvez essayer de faire des fournisseurs différents qui ont la même connexion à la base sous-jacente, comme suit:

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

Je ne pense pas que vous pouvez utiliser le schéma lui-même comme une clé de cette façon , mais vous pouvez au moins contourner le problème avec une combinaison de includeTableList et generatedNamespace. Vous avez dit que vous n'avez pas de noms de tables en double dans les différents schémas, donc cela pourrait fonctionner.

+0

Salut, merci pour la réponse rapide :-) J'ai 6 schémas au total allant de l'utilisation fortement utilisée à la lumière (config stuff). Bit inquiet à propos de 6 connexions distinctes à la même DB. Petit gars à l'arrière de ma tête en disant que c'est une mauvaise idée mais pas sûr .. – CResults

1

Juste pour que vous sachiez que j'ai ceci fonctionnant maintenant - ou au moins, compilant! :-) Pour que la solution propriétaire fonctionne pleinement bien que vous ayez besoin d'apporter plus de modifications au modèle de classe, sinon les fonctions de table/clé sont placées dans le mauvais espace de noms. J'ai également piraté avec le modèle de procédure stockée.Je n'ai pas pu (dans le court laps de temps) trouver comment diviser en fichiers/espaces de noms séparés pour chaque propriétaire, donc j'ai préfixé chaque fonction sp avec le propriétaire et un underscore.

Cependant, juste au cas où vous avez le même problème, vous saurez qu'il est possible de corriger.

Ed

3

Vous pouvez le faire dans la version 3.0 et en utilisant nos modèles de t4 (mais il est 3.5 uniquement). C'est un très bon feedback - nous devrions peut-être le faire par défaut!

Heureux d'avoir de l'aide ici.