I mange mange måneder var dette et problem for mig, og jeg undgik bare understregninger, når jeg arbejdede med SubSonic på enhver understøttet DB. Indtil i går, hvor jeg skulle støtte et legacy projekt, der havde understregninger i sin SQL Server-database.
Du bliver nødt til at rette det i kildekoden til SubSonic.Core (fil:SubSonic.Core\Schema\DatabaseTable.cs):
Find denne metode:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Og skift det til:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Dernæst skal du ændre dine Structs.tt :
Find denne nær toppen:
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#>
});
Og tilføj denne linje:
PropertyName = "<#=col.CleanName#>",
Så det bliver:
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#>
});
Problemet er, at når du har ryddet op i kolonnenavnene, forsøger SubSonic at finde de gyldige kolonner i din forespørgsel ved at matche dine SubSonic-genererede ejendomsnavne mod databasens originale kolonnenavne .
Disse ændringer vil sikre, at SubSonic matcher dem med det rensede ejendomsnavn .