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 .