В течение многих месяцев это было проблемой для меня, и я просто избегал подчеркивания при работе с SubSonic на любой поддерживаемой БД.До вчерашнего дня, когда мне приходилось поддерживать устаревший проект, который имел подчеркивание в его базе данных SQL Server.
Вам придется исправить это в исходном коде SubSonic.Core (файл: SubSonic.Core \ Schema \ DatabaseTable.cs):
Найти этот метод:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
И измените его на:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Затем вам нужно будет изменить Structs.tt :
Найти это вверху:
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#>
});
И добавьте эту строку:
PropertyName = "<#=col.CleanName#>",
, чтобы получилось:
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#>
});
Проблема в том, что после очистки имен столбцов SubSonic пытается выполнитьнайдите действительные столбцы в своем запросе, сопоставив сгенерированные имена свойств SubSonic с исходными именами столбцов базы данных .
Эти изменения обеспечат соответствие SubSonic им сочищенное имя свойства .