メンバー<列>はサブソンではサポートされていません
質問
サブソニック3.0のT4テンプレートを使用してクラスや私にとってそのようなものを生成しています。私のデータベースでは、これらの列を持つzipcodeテーブルがあります
- zipcode_rid
- zipcode(Number Formatの実際のzipcode)
- 状態
- etc
まあ、T4テンプレートがZipcode.Zipcode
のような列を持つのではなく、Zipcode.ZipcodeX
を取得するのではなく、実行されます。その後、このテーブル全体で簡単なクエリを実行しようとすると、暗号エラー
メンバー 'zipcodex'はサポートされていません
このクエリはこのようなシンプルなものです
var z= from z in Zipcode.All()
where (z.ZipcodeX == "12345")
select z;
.
サブソンのバグや私は何かをめちゃくちゃにしていますか?どんな回避策がありますか?
Zipcode
列の名前をZipCode
に名前変更することで、この問題を一時的に取り組んでいます。しかし、これは非常に良い長期ソリューションではありません。
解決
これはサブソンのバグであり、あなたは何か悪いことをしています。現在サブソニックはそれらを含むテーブルと同じ名前の列をサポートしません。テンプレートはxを列名に追加することによってこれを回避しようとしますが、サブソックスコアは吹き飛ばされます。
修正はあなたの列またはテーブルの名前を変更することです、zipcode.zipcodeは私には意味がないかもしれません。zipcode.codeはより適切になるでしょう。
他のヒント
これがうまくいくかどうかわかりませんが、試してみることができます。それは少し痛みですが、私はそれを行くようにしました。
ステップ1 settings.ttinclude関数
がありますString Cleanup(String TableName)
その下の新しいものを作成する(
が好きな拡張子/名前変更アルゴリズムを追加するString Cleanup(String ColName、String TableName){
.string result=colName; //strip blanks result=result.Replace(" ",""); //put your logic here... if (result.ToLower() == tableName.ToLower()) { result = colName + "X"; } return result;
}
ステップ2 SQLServer.ttinclude(またはデータソースの同等のファイル)では、ライン167行のようなものがあります。
col.cleanname= cleanup(col.name);
これを変更してください。
col.cleanname= cleanup(col.name、tbl.name);
ステップ3 これが痛みが本当に始まる場所です。 subsicsetable.csの変更
のソースコードをつかみます。.public IColumn GetColumnByPropertyName(string PropertyName)
.public virtual IColumn GetColumnByPropertyName(string PropertyName)
ステップ4
の後のstructs.ttパブリック静的文字列<#= col.cleanname#>列{ 取得する{ "<#= col.name#>"を返します。 } }
次の追加
<#if(col.cleanname!= col.name){#>
.public override IColumn GetColumnByPropertyName(string columName){ if (columName == "<#= col.CleanName #>") return <#=col.CleanName#>; else return base.GetColumnByPropertyName(columName); }
<#}#>
これを行った後のすべての.csファイルを再生成する必要があります。