Under många månader var detta ett problem för mig och jag undvek bara understreck när jag arbetade med SubSonic på någon DB som stöds. Tills igår när jag var tvungen att stödja ett äldre projekt som hade understreck i sin SQL Server-databas.
Du måste fixa det i källkoden för SubSonic.Core (fil:SubSonic.Core\Schema\DatabaseTable.cs):
Hitta den här metoden:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Och ändra det till:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Därefter måste du ändra dina Structs.tt :
Hitta det här nära 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#>
});
Och lägg till den här raden:
PropertyName = "<#=col.CleanName#>",
Så att det blir:
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 är att när du har rensat upp kolumnnamnen försöker SubSonic hitta de giltiga kolumnerna i din fråga genom att matcha dina SubSonic-genererade egendomsnamn mot databasens ursprungliga kolumnnamn .
Dessa ändringar kommer att se till att SubSonic matchar dem mot det rensade egendomsnamnet .