Das Mitglied <some Column> wird in SubSonic nicht unterstützt
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
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.