Gedurende vele maanden was dit een probleem voor mij en ik vermeed gewoon onderstrepingstekens bij het werken met SubSonic op een ondersteunde DB. Tot gisteren, toen ik een verouderd project moest ondersteunen met onderstrepingen in de SQL Server-database.
Je moet het oplossen in de broncode van SubSonic.Core (bestand:SubSonic.Core\Schema\DatabaseTable.cs):
Zoek deze methode:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.Name.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
En verander het in:
public IColumn GetColumnByPropertyName(string PropertyName)
{
return Columns.SingleOrDefault(x => x.PropertyName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase));
}
Vervolgens moet je je Structs.tt . aanpassen :
Vind dit bovenaan:
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#>
});
En voeg deze regel toe:
PropertyName = "<#=col.CleanName#>",
Zodat het wordt:
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#>
});
Het probleem is dat zodra u de kolomnamen heeft opgeschoond, SubSonic probeert de geldige kolommen in uw zoekopdracht te vinden door uw door SubSonic gegenereerde eigenschapsnamen te matchen. tegen de originele kolomnamen . van de database .
Deze wijzigingen zorgen ervoor dat SubSonic ze vergelijkt met de opgeschoonde eigenschapsnaam .