我正在使用SubSonic 3.0的T4模板为我生成类等。在我的数据库中,我有一个包含这些列的Zipcode表
好吧,当T4模板运行时,我得到Zipcode.Zipcode
而不是Zipcode.ZipcodeX
这样的列。然后,当尝试在此表中运行简单查询时,我得到了神秘错误
不支持会员'ZipcodeX'
查询就像这样简单
var z= from z in Zipcode.All()
where (z.ZipcodeX == "12345")
select z;
这是SubSonic中的一个错误还是我弄乱了什么?有什么变通方法?
我暂时通过将Zipcode
列重命名为ZipCode
来解决此问题..但这不是一个非常好的长期解决方案
答案 0 :(得分:2)
这既是亚音速的错误又是你做错了什么。目前,subsonic不支持与包含它们的表同名的列。模板尝试通过将X添加到列名称来解决此问题,但亚音速核心随后会爆炸。
修复是重命名您的列或表,Zipcode.Zipcode对我来说没有意义,Zipcode.Code可能更合适。
答案 1 :(得分:0)
我不确定这是否有效,但您可以尝试一下。这有点痛苦,但我确实让它去了。
第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步 这就是疼痛真正开始的地方。获取SubSonic.Core的源代码(是:()并在DatabaseTable.cs中更改
public IColumn GetColumnByPropertyName(string PropertyName)
到
public virtual IColumn GetColumnByPropertyName(string PropertyName)
第4步 在
之后的Structs.tt中public static string<#= col.CleanName#> Column { 得到{ return“<#= 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); }
&lt;#}#&gt;
执行此操作后,您可能需要重新生成所有.cs文件。