El miembro <alguna columna> no es compatible con SubSonic
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
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.