Przez wiele miesięcy stanowiło to dla mnie problem i po prostu unikałem podkreśleń podczas pracy z SubSonic na dowolnym obsługiwanym DB. Aż do wczoraj, kiedy musiałem wspierać przestarzały projekt, który miał podkreślenia w bazie danych SQL Server.
Musisz to naprawić w kodzie źródłowym SubSonic.Core (plik:SubSonic.Core\Schema\DatabaseTable.cs):
Znajdź tę metodę:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
I zmień go na:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Następnie musisz zmodyfikować swój Structs.tt :
Znajdź to u góry:
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#>
});
I dodaj ten wiersz:
PropertyName = "<#=col.CleanName#>",
Tak, że staje się:
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#>
});
Problem polega na tym, że po wyczyszczeniu nazw kolumn SubSonic próbuje znaleźć prawidłowe kolumny w zapytaniu, dopasowując wygenerowane przez SubSonic nazwy właściwości w stosunku do oryginalnych nazw kolumn w bazie danych .
Dzięki tym zmianom SubSonic dopasuje je do oczyszczonej nazwy właściwości .