Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SubSonic 3 und MySQL, das Entfernen des Unterstrichs aus dem Spaltennamen in der CleanUp()-Methode verursacht Ausnahmen, wenn die Eigenschaft in linq-query verwendet wird

Viele Monate lang war dies ein Problem für mich und ich habe einfach Unterstriche vermieden, wenn ich mit SubSonic an einer unterstützten Datenbank gearbeitet habe. Bis gestern, als ich ein älteres Projekt unterstützen musste, das Unterstriche in seiner SQL Server-Datenbank hatte.

Sie müssen es im Quellcode von SubSonic.Core beheben (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 in:

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

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

Finden Sie dies ganz 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 hinzu:

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

Damit es wird:

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 SubSonic nach dem Bereinigen der Spaltennamen versucht, die gültigen Spalten in Ihrer Abfrage zu finden, indem es Ihre von SubSonic generierten Eigenschaftsnamen abgleicht gegen die ursprünglichen Spaltennamen der Datenbank .

Diese Änderungen stellen sicher, dass SubSonic sie mit dem bereinigten Eigenschaftsnamen abgleicht .