SubSonic 3 und MySQL, verursacht Strich von Spaltennamen in CleanUp () -Methode Ausnahmen zu entfernen, wenn Eigenschaft in Linq-Abfrage

StackOverflow https://stackoverflow.com/questions/2286884

Frage

Ich habe auf ein Problem stoßen bei der Verwendung von SubSonic 3 (.0.0.3) Active mit MySQL.

Da MySQL nicht zulässt, dass Sie Großbuchstaben in Tabellen- oder Spaltennamen verwenden (oder besser gesagt es missachtet wenn Sie das tun) habe ich beschlossen, getrennte Wörter Unterstrichen, z.B. ENTITY_ID und verwenden dann den Bereinigungs () Methode Titel Gehäuse hinzufügen und die Unterstreichungs entfernen.
Ein Freund schrieb einen ToTitleCase (string s) -Methode, die wie folgt aussieht:

string ToTitleCase(string s)
{
    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    return textInfo.ToTitleCase(s);
}

Und die CleanUp () Methode sieht wie folgt aus:

string CleanUp(string tableName){
    string result=tableName;

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

    //put your logic here...
    result = ToTitleCase(result);
    result = result.Replace("_", "");

    return result;
}

Wenn ich dann tun:

var entity = Entity.All().Where(e => e.EntityName.Contains("John"));

ich eine NotSupportedException erhalten, mit der Meldung „Das Element‚EntityName‘wird nicht unterstützt.“

Wenn ich entfernen

result = result.Replace("_", "");

Alles funktioniert ganz gut, nur ich Eigenschaften wie ENTITY_ID suchen, welche nicht ganz ist, was ich will.

Wenn jemand weiß, warum dies geschehen, würde ich gerne hören. Wenn es möglich ist, zu beheben, noch besser! Es ist kein Hemmschuh, aber es ist etwas ärgerlich.

War es hilfreich?

Lösung

Für viele viele Monate war dies ein Thema für mich und ich Unterstrichen nur vermieden werden, wenn mit SubSonic auf jeder unterstützten DB arbeiten. Bis gestern, als ich hatte ein Vermächtnis Projekt zu unterstützen, die Unterstreichungen in seiner SQL Server-Datenbank hatte.

Sie müssen es beheben innerhalb des Quellcodes von SubSonic.Core (Datei: SubSonic.Core \ Schema \ DatabaseTable.cs):

Finden Sie diese Methode:

public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

Und ändern Sie es an:

public IColumn GetColumnByPropertyName(string PropertyName)
{
    return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}

Als Nächstes werden Sie Ihre Structs.tt ändern müssen :

So finden Sie in der Nähe von oben:

Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
{
    IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
    DataType = DbType.<#=col.DbType.ToString()#>,
    IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
    AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
    IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,
    MaxLength = <#=col.MaxLength#>
});

Und fügen Sie diese Zeile:

    PropertyName = "<#=col.CleanName#>",

Damit wird es:

Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
{
    PropertyName = "<#=col.CleanName#>",
    IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
    DataType = DbType.<#=col.DbType.ToString()#>,
    IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
    AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
    IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,
    MaxLength = <#=col.MaxLength#>
});

Das Problem ist, dass, sobald Sie die Spaltennamen gereinigt, SubSonic versucht der die gültigen Spalten in Ihrer Abfrage finden, indem Sie Ihre SubSonic generiert Eigenschaftsnamen passende gegen die ursprüngliche Datenbank Spaltennamen .

werden diese Änderungen stellen Sie sicher, dass SubSonic sein, um sie gegen die gereinigte Eigenschaftsnamen passende .

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