Pregunta

Estoy usando las plantillas T4 de SubSonic 3.0 para generar clases y demás para mí.Bueno, en mi base de datos tengo una tabla de códigos postales con estas columnas.

  • Código Postal_rid
  • Código postal (el código postal real en formato numérico)
  • Estado
  • etc.

Bueno, cuando se ejecutan las plantillas T4, en lugar de tener una columna como Zipcode.Zipcode yo obtengo Zipcode.ZipcodeX.Luego, al intentar ejecutar una consulta simple en esta tabla, aparece el error críptico

El miembro 'ZipcodeX' no es compatible

La consulta es algo simple como esto.

var z= from z in Zipcode.All()
       where (z.ZipcodeX == "12345")
       select z;

¿Es esto un error en SubSonic o estoy arruinando algo?¿Qué soluciones existen?

He solucionado temporalmente este problema cambiando el nombre del Zipcode columna a ZipCode..pero esta no es una muy buena solución a largo plazo

¿Fue útil?

Solución

Esto es tanto un error en subsonic como que estás haciendo algo mal.Actualmente, subsonic no admite columnas con el mismo nombre que la tabla que las contiene.La plantilla intenta solucionar este problema añadiendo la X al nombre de la columna, pero el núcleo subsónico explota.

La solución es cambiar el nombre de su columna o tabla, Zipcode.Zipcode realmente no tiene sentido para mí, tal vez Zipcode.Code sería más apropiado.

Otros consejos

No estoy seguro de si esto funcionará, pero puedes intentarlo.Es un poco doloroso pero lo logré.

Paso 1En settings.ttinclude hay una función

limpieza de cadena (nombre de tabla de cadena)

Cree uno nuevo justo debajo de este modo (agregando cualquier algoritmo de extensión/cambio de nombre que desee).

limpieza de cadena (cadena nombrecol, cadena nombretabla){

  string result=colName;

  //strip blanks
  result=result.Replace(" ","");

  //put your logic here...
  if (result.ToLower() == tableName.ToLower())
  {
      result = colName + "X";
  }

  return result;

}

Paso 2En SQLServer.ttinclude (o el archivo equivalente para su fuente de datos) hay aproximadamente en la línea 167 una línea como:

col.CleanName = Limpieza(col.Nombre);

Cambie esto a:

col.CleanName = Limpieza(col.Nombre, tbl.Nombre);

Paso 3Aquí es donde realmente comienza el dolor.Obtenga el código fuente de SubSonic.Core (Sí :() y en DatabaseTable.cs cambie

    public IColumn GetColumnByPropertyName(string PropertyName)

a

    public virtual IColumn GetColumnByPropertyName(string PropertyName)

Etapa 4En Structs.tt después

public static string < #= col.CleanName #> columna {get {return "< #= col.name #>";}}

agregue lo siguiente

<# if (col.CleanName!= col.Name) { #>

       public override IColumn GetColumnByPropertyName(string columName){
           if (columName == "<#= col.CleanName #>")
               return <#=col.CleanName#>;
            else
               return base.GetColumnByPropertyName(columName);
        }

<# } #>

Probablemente necesitarás regenerar todos los archivos .cs después de hacer esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top