Po mnoho měsíců to pro mě byl problém a při práci se SubSonic na jakékoli podporované databázi jsem se vyhýbal podtržení. Až do včerejška, kdy jsem musel podporovat starší projekt, který měl ve své databázi SQL Server podtržítka.
Budete to muset opravit ve zdrojovém kódu SubSonic.Core (soubor:SubSonic.Core\Schema\DatabaseTable.cs):
Najděte tuto metodu:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
A změňte jej na:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Dále budete muset upravit svůj Structs.tt :
Najděte toto nahoře:
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#>
});
A přidejte tento řádek:
PropertyName = "<#=col.CleanName#>",
Aby se to stalo:
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#>
});
Problém je v tom, že jakmile vyčistíte názvy sloupců, SubSonic se pokusí najít platné sloupce ve vašem dotazu porovnáním názvů vlastností generovaných SubSonic proti původním názvům sloupců databáze .
Tyto změny zajistí, že je SubSonic porovná s vyčištěným názvem vlastnosti .