2009-04-16 17 views
6

Acabo de empezar a usar Subsonic 2.2 y hasta ahora estoy muy impresionado, creo que me ahorrará tiempo de codificación.subsónico: cómo usar el esquema SQL/el nombre del propietario como parte del espacio de nombres?

Antes de sumergirme en su uso a tiempo completo, hay algo que me molesta que me gustaría resolver.

En mi base de datos actual (un db SQL2008) he dividido las tablas, vistas, sps, etc. en trozos separados por esquema/nombre del propietario, por lo que todas las tablas de clientes están en el cliente. esquema, productos en el producto. esquema, etc., así que para seleccionar de la tabla de direcciones del cliente haría un seleccionar * del cliente.dirección

Desafortunadamente, Subsonic ignora el nombre del esquema/propietario y simplemente me da el nombre de la tabla base. Esto está bien, ya que no tengo duplicados entre los esquemas (por ejemplo, Customer.Address y Supplier.Address no existen), pero creo que el código podría ser más claro si pudiera dividir por esquema.

Idealmente me gustaría poder alterar el espacio de nombres por esquema/propietario: creo que esto tendría un impacto menor en SubSonic y facilitaría la lectura del código resultante.

El problema es que he rastreado todo el origen de Subsonic y no tengo ni idea de cómo hacerlo (no ayuda que código en VB no C# = sí lo sé, culpe al ZX Spectrum !!)

Si alguien ha abordado esto antes o tiene una idea de cómo resolverlo, yo estaría muy agradecido,

Gracias de antemano.

Ed

Respuesta

6

Iba a sugerir el enfoque de proveedor múltiple también. Pero mucha de la tubería ya está subsónica para ser propiedad. Si edita un par de líneas en CS_ClassTemplate.aspx, puede crear un espacio de nombres para cada perfil de propietario. Cambio en torno a la línea 58 (estoy usando v2.1) para

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

donde el propietario es

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

Pones que allá arriba, alrededor de la línea 14. De esta manera usted puede tener un espacio de nombres para cada propietario como: Northwind.Suppliers, Northwind.Customers, etc. Dejé dbo como solo Northwind para que todas las pruebas se compilaran sin mucha edición. Ejecuté una consulta de selección simple y creo que funcionará de la manera que desee.

+0

También tiene que alterar un poco el generador de ODSController y Structs, pero es muy fácil. –

+0

Tengo una situación similar. Sin embargo, es aún más complicado tener algunas tablas con el mismo nombre en diferentes esquemas. ¿Hay alguna manera de evitarlo? – Muxa

1

Usted podría intentar hacer los proveedores independientes que tienen la misma conexión de base de datos subyacente, así:

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

No creo que se puede utilizar el esquema como una clave de esta manera , pero al menos podría solucionar el problema con una combinación de includeTableList y generatedNamespace. Usted dijo que no tiene nombres de tabla duplicados en los diferentes esquemas, por lo que podría funcionar.

+0

Hola, gracias por la respuesta rápida :-) Tengo 6 esquemas en total que van desde uso muy usado hasta el uso de luz (cosas de configuración). Poco preocupado por 6 conexiones separadas a la misma base de datos. Un tipo pequeño en la parte posterior de mi cabeza diciendo que esto es una mala idea, pero no estoy seguro. – CResults

1

¡Solo para hacerle saber que ahora estoy trabajando - o al menos compilando! :-) Para que la solución de propietario funcione completamente, deberá realizar más cambios en la plantilla de clase, ya que de lo contrario las funciones de tabla/clave se ubicarán en el espacio de nombres incorrecto.

También he hackeado la plantilla de procedimiento almacenado.No pude (en el corto tiempo que tengo) averiguar cómo dividir en archivos/espacios de nombres separados para cada propietario, así que en su lugar he puesto como prefijo cada función sp con el propietario y un guión bajo.

Sin embargo, en caso de que tenga el mismo problema sabrá que es posible corregirlo.

Ed

3

Se podría hacer esto en 3.0, así usando nuestras plantillas T4 (pero es sólo 3,5). Este es un muy buen comentario, ¡deberíamos construir esto por defecto quizás!

Me alegro de que haya algo de ayuda aquí.

Cuestiones relacionadas