В продължение на много месеци това беше проблем за мен и аз просто избягвах долните черти, когато работех с SubSonic на всяка поддържана DB. До вчера, когато трябваше да поддържам наследен проект, който имаше долни черти в базата данни на 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 ги съпоставя с изчистеното име на собственост .