代码之家  ›  专栏  ›  技术社区  ›  Earlz

亚音速中不支持成员<some column>

  •  0
  • Earlz  · 技术社区  · 14 年前

    我正在使用亚音速3.0的t4模板为我生成类等。在我的数据库中,我有一个包含这些列的zipcode表

    • 吉普赛德
    • 邮政编码(数字格式的实际邮政编码)
    • 状态

    嗯,当t4模板运行时,而不是像 Zipcode.Zipcode 我得到 Zipcode.ZipcodeX . 然后,当尝试在这个表中运行一个简单的查询时,我会得到一个神秘的错误

    不支持成员“zipcodex”

    这个查询很简单

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

    这是亚音速的错误还是我弄乱了什么?有什么解决办法?

    我暂时通过重命名 Zipcode 列到 ZipCode …但这不是一个很好的长期解决方案

    2 回复  |  直到 14 年前
        1
  •  2
  •   Adam Cooper    14 年前

    这既是亚音速的缺陷,也是你做错了什么。当前,SubSonic不支持与包含这些列的表同名的列。模板试图通过在列名中添加x来解决这个问题,但是亚音速核心随后会爆炸。

    修复方法是重命名列或表,zipcode。zipcode对我来说不太有意义,也许zipcode。代码更合适。

        2
  •  0
  •   Mark    14 年前

    我不确定这是否有效,但你可以试试。虽然有点疼,但我还是坚持了下来。

    步骤1 在settings.ttinclude中有一个函数

    字符串清理(字符串表名)

    在它下面创建一个新的(添加任何您喜欢的扩展/重命名算法

    字符串清理(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=清理(col.name);

    将此更改为:

    col.cleanname=清理(col.name,tbl.name);

    步骤3 这就是痛苦真正开始的地方。获取subsonic.core的源代码(是:()并在databasetable.cs change中

        public IColumn GetColumnByPropertyName(string PropertyName)
    

        public virtual IColumn GetColumnByPropertyName(string PropertyName)
    

    步骤4 在structs.tt之后

    公共静态字符串<=col.cleanname>列{ 获取{ 返回“<=col.name>”; } }

    添加以下内容

    <#如果(col.cleanname!=col.name)列名称

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

    <#}#>

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

    推荐文章