SubSonic </some>不支持成员<some column =“”>

时间:2010-07-22 21:48:56

标签: .net linq subsonic subsonic3

我正在使用SubSonic 3.0的T4模板为我生成类等。在我的数据库中,我有一个包含这些列的Zipcode表

  • ZipCode_rid
  • Zipcode(数字格式的实际邮政编码)
  • 国家

好吧,当T4模板运行时,我得到Zipcode.Zipcode而不是Zipcode.ZipcodeX这样的列。然后,当尝试在此表中运行简单查询时,我得到了神秘错误

  

不支持会员'ZipcodeX'

查询就像这样简单

var z= from z in Zipcode.All()
       where (z.ZipcodeX == "12345")
       select z;

这是SubSonic中的一个错误还是我弄乱了什么?有什么变通方法?

我暂时通过将Zipcode列重命名为ZipCode来解决此问题..但这不是一个非常好的长期解决方案

2 个答案:

答案 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&lt;#= col.CleanName#&gt; Column {                   得到{                     return“&lt;#= col.Name#&gt;”;                 }             }

添加以下内容

  

&lt; #if(col.CleanName!= col.Name){#&gt;

       public override IColumn GetColumnByPropertyName(string columName){
           if (columName == "<#= col.CleanName #>")
               return <#=col.CleanName#>;
            else
               return base.GetColumnByPropertyName(columName);
        }
     

&lt;#}#&gt;

执行此操作后,您可能需要重新生成所有.cs文件。