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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top