Frage

Ich verwende die T4-Vorlagen von SubSonic 3.0, um Klassen und dergleichen für mich zu generieren.Nun, in meiner Datenbank habe ich eine Postleitzahlentabelle mit diesen Spalten

  • ZipCode_rid
  • Postleitzahl (die tatsächliche Postleitzahl im Zahlenformat)
  • Zustand
  • usw

Nun, wenn die T4-Vorlagen ausgeführt werden, anstatt eine Spalte wie zu haben Zipcode.Zipcode Ich bekomme Zipcode.ZipcodeX.Wenn ich dann versuche, eine einfache Abfrage über diese Tabelle auszuführen, erhalte ich den kryptischen Fehler

Das Mitglied „ZipcodeX“ wird nicht unterstützt

Die Abfrage ist so etwas Einfaches

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

Ist das ein Fehler in SubSonic oder mache ich etwas kaputt?Welche Workarounds gibt es?

Ich habe dieses Problem vorübergehend umgangen, indem ich das umbenannt habe Zipcode Spalte zu ZipCode..aber das ist keine sehr gute langfristige Lösung

War es hilfreich?

Lösung

Das ist sowohl ein Fehler in Subsonic als auch, dass Sie etwas falsch gemacht haben.Derzeit unterstützt Subsonic keine Spalten mit demselben Namen wie die Tabelle, die sie enthält.Die Vorlage versucht, dies zu umgehen, indem sie das X zum Spaltennamen hinzufügt, aber der Unterschallkern explodiert dann.

Die Lösung besteht darin, Ihre Spalte oder Tabelle umzubenennen. Zipcode.Zipcode macht für mich nicht wirklich Sinn, vielleicht wäre Zipcode.Code passender.

Andere Tipps

Ich bin mir nicht sicher, ob das funktionieren wird, aber Sie können es versuchen.Es ist ein bisschen schmerzhaft, aber ich habe es hinbekommen.

Schritt 1In Settings.ttinclude gibt es eine Funktion

string CleanUp(string tabellenname)

Erstellen Sie direkt darunter ein neues wie folgt (fügen Sie den gewünschten Erweiterungs-/Umbenennungsalgorithmus hinzu).

string CleanUp(string colName, string tableName){

  string result=colName;

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

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

  return result;

}

Schritt 2In SQLServer.ttinclude (oder der entsprechenden Datei für Ihre Datenquelle) gibt es etwa in Zeile 167 eine Zeile wie:

col.CleanName = CleanUp(col.Name);

Ändern Sie dies in:

col.CleanName = CleanUp(col.Name, tbl.Name);

Schritt 3Hier fängt der Schmerz erst richtig an.Besorgen Sie sich den Quellcode für SubSonic.Core (Ja :() und ändern Sie ihn in DatabaseTable.cs

    public IColumn GetColumnByPropertyName(string PropertyName)

Zu

    public virtual IColumn GetColumnByPropertyName(string PropertyName)

Schritt 4In Structs.tt nach

public static String < #= col.Cleanname #> Spalte {get {return "< #= col.name #>";}}

füge Folgendes hinzu

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

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

<# } #>

Anschließend müssen Sie wahrscheinlich alle CS-Dateien neu generieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top