何ヶ月もの間、これは私にとって問題であり、サポートされているDBでSubSonicを使用するときは、アンダースコアを避けました。昨日まで、SQLServerデータベースにアンダースコアが含まれているレガシープロジェクトをサポートする必要がありました。
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がクリーンアップされたプロパティ名と確実に一致するようになります。 。