Por muitos e muitos meses isso foi um problema para mim e eu apenas evitei sublinhados ao trabalhar com SubSonic em qualquer banco de dados suportado. Até ontem quando tive que dar suporte a um projeto legado que tinha sublinhados em seu banco de dados SQL Server.
Você terá que corrigi-lo dentro do código-fonte do SubSonic.Core (arquivo:SubSonic.Core\Schema\DatabaseTable.cs):
Encontre este método:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
E altere para:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Em seguida, você terá que modificar seu Structs.tt :
Encontre isso perto do topo:
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 adicione esta linha:
PropertyName = "<#=col.CleanName#>",
Para que fique:
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#>
});
O problema é que, depois de limpar os nomes das colunas, o SubSonic tenta encontrar as colunas válidas em sua consulta, correspondendo aos nomes de propriedade gerados pelo SubSonic contra os nomes de coluna originais do banco de dados .
Essas alterações garantirão que o SubSonic as corresponda ao nome da propriedade limpo .