Mysql
 sql >> Database >  >> RDS >> Mysql

SubSonic 3 e MySQL, la rimozione del carattere di sottolineatura dal nome della colonna nel metodo CleanUp() causa eccezioni quando si utilizza la proprietà in linq-query

Per molti mesi questo è stato un problema per me e ho semplicemente evitato i caratteri di sottolineatura quando lavoravo con SubSonic su qualsiasi DB supportato. Fino a ieri, quando ho dovuto supportare un progetto legacy che aveva caratteri di sottolineatura nel suo database di SQL Server.

Dovrai risolverlo all'interno del codice sorgente di SubSonic.Core (file:SubSonic.Core\Schema\DatabaseTable.cs):

Trova questo metodo:

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

E cambialo in:

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

Successivamente dovrai modificare il tuo Structs.tt :

Trova questo vicino alla parte superiore:

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#>
});

E aggiungi questa riga:

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

In modo che diventi:

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#>
});

Il problema è che una volta ripuliti i nomi delle colonne, SubSonic prova a trovare le colonne valide nella tua query facendo corrispondere i nomi di proprietà generati da SubSonic contro i nomi di colonna originali del database .

Queste modifiche assicureranno che SubSonic li abbini al nome proprietà pulito .