Il membro non è supportato in subsonic
Domanda
Sto usando i modelli T4 di Subsonic 3.0 per generare classi e tali per me.Bene nel mio database ho una tabella con codice postale con queste colonne
- .
- zipcode_rid
- Zipcode (il codice postale effettivo in formato numerico)
- stato
- etc
Bene, quando i modelli T4 funzionano, invece di avere una colonna come Zipcode.Zipcode
ottengo Zipcode.ZipcodeX
.Quindi, quando si tenta di eseguire una semplice ricerca su questa tabella ottengo l'errore criptico
.Il membro 'zipcodex' non è supportato
La query è qualcosa di semplice come questa
var z= from z in Zipcode.All()
where (z.ZipcodeX == "12345")
select z;
.
È un bug in subsponso o sto scherzando qualcosa?Quali soluzioni alternativi ci sono?
Ho temporaneamente lavorato attorno a questo problema rinominando la colonna Zipcode
a ZipCode
.. Ma questa non è una soluzione molto buona a lungo termine
Soluzione
Questo è sia un bug in subsponso e stai facendo qualcosa di sbagliato.Attualmente subsonico non supporta le colonne con lo stesso nome della tabella che li contiene.Il modello cerca di aggirare questo aggiungendo la X al nome della colonna, ma il nucleo subsonico si accende quindi.
La correzione è di rinominare la colonna o la tabella, ZIPCODE.ZIPCODE non ha senso per me forse forse il codice postale.Code sarebbe più appropriato.
Altri suggerimenti
Non sono sicuro se funzionerà, ma puoi provarlo. È un po 'di dolore ma l'ho fatto per andare.
Step 1 In Impostazioni.Tinclude c'è una funzione
.String Cleanup (String TableName)
Crea uno nuovo Solo sotto di esso come questo (aggiungendo qualsiasi algoritmo di estensione / rinomina che ti piace
.String Cleanup (stringa colname, corda per tablename) {
.string result=colName; //strip blanks result=result.Replace(" ",""); //put your logic here... if (result.ToLower() == tableName.ToLower()) { result = colName + "X"; } return result;
}
Step 2 In SQLServer.tinclude (o il file equivalente per la tua origine dati) c'è a proposta di linea 167 A riga come:
.col.cleanname= cleanup (col.name);
Modifica questo in:
.col.cleanname= cleanup (col.name, tbl.name);
Step 3 È qui che inizia davvero il dolore. Prendi il codice sorgente per subsonico.core (sì :() e in databasetable.cs Cambia
..public IColumn GetColumnByPropertyName(string PropertyName)
a
..public virtual IColumn GetColumnByPropertyName(string PropertyName)
Step 4 A forceri.tt dopo
.Stringa statica pubblica <#= col.CleanName #> Colonna { ottenere{ ritorno "<#= col.name #>"; } }
Aggiungi il seguente
.<# se (col.cleanname!= col.name) {#>
.public override IColumn GetColumnByPropertyName(string columName){ if (columName == "<#= col.CleanName #>") return <#=col.CleanName#>; else return base.GetColumnByPropertyName(columName); }
<#} #>
Probabilmente dovrai rigenerare tutti i file .cs dopo averlo fatto.