2009-04-16 8 views
6

Ich habe gerade angefangen, Subsonic 2.2 zu verwenden und bisher sehr beeindruckt - denke, es wird mir ein wenig Programmierzeit ersparen.Subsonic - Wie wird SQL Schema/Ownername als Teil des Namespace verwendet?

Bevor ich es in Vollzeit benutze, obwohl es etwas gibt, das mich nervt, würde ich gerne aussortieren.

In meiner aktuellen Datenbank (eine SQL2008-Datenbank) habe ich die Tabellen, Ansichten, Sps usw. in einzelne Chunks nach Schema/Besitzernamen aufgeteilt, so dass alle Kundentabellen im Kunden sind. Schema, Produkte im Produkt. Schema usw., also eine aus der Kundenadressentabelle zu wählen, würde ich eine Auswahl * von customer.address machen

Leider ignoriert Subsonic den Namen des Schemas/Besitzers und gibt mir nur den Basistabellennamen. Dies ist in Ordnung, da ich keine Duplikate zwischen Schemas (z. B. Customer.Address und Supplier.Address nicht beide vorhanden) habe, aber ich fühle einfach, dass der Code klarer sein könnte, wenn ich nach Schema aufteilen könnte.

Idealerweise würde ich gerne den Namespace nach Schema/Besitzer ändern können - ich denke, das hätte den geringsten Einfluss auf SubSonic, macht aber den resultierenden Code leichter lesbar.

Problem ist, ich habe überall auf der Subsonic Quelle gecrawlt und habe keine Ahnung, wie man das macht (hilft nicht, dass ich in VB nicht C# code = ja ich weiß, beschuldigen die ZX Spectrum !!)

Wenn jemand vorher eine Idee, wie es zu lösen hat oder in Angriff genommen hat, ich wirklich dankbar sein würde,

Vielen Dank im Voraus.

Ed

Antwort

6

Ich würde vorschlagen, die Multiple-Provider-Ansatz auch. Aber viele der Rohrleitungen sind bereits in Unterschall für den Besitz. Wenn Sie einige Zeilen in CS_ClassTemplate.aspx bearbeiten, können Sie einen Namespace für jedes Besitzerprofil erstellen. Ändern um die Linie 58 (Ich bin mit v2.1) zu

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

wo Besitzer

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

Sie, dass oben setzen, um die Linie 14. Auf diese Weise können Sie einen Namespace für jeden Besitzer wie: Northwind.Lieferanten, Northwind.Customers, etc. Ich verließ dbo als nur Northwind so alle Tests kompilieren würde, ohne viel zu bearbeiten. Ich habe eine einfache Select-Abfrage ausgeführt und ich denke, es wird so funktionieren, wie Sie möchten.

+0

Sie müssen auch den ODSController und Structs Generator ein wenig ändern, aber es ist sehr einfach. –

+0

Ich habe eine ähnliche Situation. Es ist jedoch noch komplizierter, wenn einige Tabellen in verschiedenen Schemata denselben Namen haben. Gibt es einen Weg dahin? – Muxa

1

Sie könnten versuchen, getrennte Anbieter zu tun, die die gleiche zugrunde liegende Datenbankverbindung haben, etwa so:

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

Ich glaube nicht, dass Sie das Schema selbst als Schlüssel auf diese Weise verwenden können , aber Sie könnten das Problem zumindest mit einer Kombination aus includeTableList und generatedNamespace umgehen. Sie haben gesagt, dass Sie in den verschiedenen Schemas keine doppelten Tabellennamen haben. Es könnte also funktionieren.

+0

Hallo, danke für die schnelle Antwort :-) Ich habe insgesamt 6 Schemata von stark bis leicht (config stuff) benutzt. Etwas besorgt über 6 separate Verbindungen zu der gleichen db. Kleiner Kerl in meinem Hinterkopf sagt das ist eine schlechte Idee, aber nicht sicher .. – CResults

1

Nur um Sie wissen zu lassen, ich habe das jetzt funktioniert - oder zumindest kompilieren! :-) Damit die Eigentümerlösung vollständig funktioniert, müssen Sie weitere Änderungen an der Klassenvorlage vornehmen, da sich sonst die Tabellen-/Schlüsselfunktionen im falschen Namespace befinden.

Ich habe auch mit der gespeicherten Prozedur-Vorlage gehackt.Ich konnte nicht (in der kurzen Zeit, die ich habe) herausfinden, wie man in getrennte Dateien/Namespaces für jeden Besitzer aufteilt, stattdessen habe ich jede SP Funktion mit dem Eigentümer und einem Unterstrich vorangestellt.

Nur für den Fall, dass Sie das gleiche Problem haben, wissen Sie, dass es möglich ist, zu beheben.

Ed

3

Sie dies auch in 3.0 tun könnte unsere T4 Vorlagen (aber es ist 3.5 nur). Das ist ein wirklich gutes Feedback - wir sollten das vielleicht standardmäßig einbauen!

Ich bin froh, dass Sie hier Hilfe bekommen haben.