【问题标题】:The member <some column> is not supported in SubSonicSubSonic 不支持成员 <some column>
【发布时间】:2010-07-22 21:48:55
【问题描述】:

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

  • ZipCode_rid
  • 邮政编码(数字格式的实际邮政编码)
  • 状态

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

不支持成员“ZipcodeX”

查询很简单

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

这是 SubSonic 中的错误还是我搞砸了?有哪些解决方法?

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

【问题讨论】:

    标签: .net linq subsonic subsonic3


    【解决方案1】:

    这既是亚音速的错误,也是您做错了什么。目前 subsonic 不支持与包含它们的表同名的列。模板试图通过将 X 添加到列名称来解决此问题,但亚音速核心随后会爆炸。

    解决方法是重命名您的列或表,Zipcode.Zipcode 对我来说真的没有意义,也许 Zipcode.Code 会更合适。

    【讨论】:

    • 不是一个很好的答案,但它是正确的答案.. 关于您自己的建议,我们不能只是重命名它(除了让它不同的大小写),因为我们目前处于之间的迁移使用 ORM 并附加字符串来进行我们自己的查询..
    【解决方案2】:

    我不确定这是否可行,但您可以尝试一下。这有点痛苦,但我确实做到了。

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

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

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

    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 之后

    公共静态字符串 Column{ 得到{ 返回“”; } }

    添加以下内容

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多