2010-07-22 71 views
0

我正在使用SubSonic 3.0的T4模板为我生成类和类。那么在我的数据库中,我有这些列SubSonic不支持会员<some column>

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

嘛邮政编码表,当T4模板运行,而不是像Zipcode.Zipcode列我得到Zipcode.ZipcodeX。然后,尝试运行过这个表的简单查询,我得到了神秘的错误时

成员“ZipcodeX”不支持

查询是一些简单的像这样

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

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

我已经暂时解决此问题通过重命名ZipcodeZipCode工作..但是这不是一个很好的长期解决方案

回答

2

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

解决的办法是重命名你的列或表,Zipcode.Zipcode对我来说并没有什么意义,也许Zipcode.Code会更合适。

+0

不是一个很好的答案,但它是正确的答案。关于你自己的建议,我们不能只是重命名它(除了使它不同的情况),因为我们目前在使用ORM和追加字符串来做我们自己的查询.. – Earlz 2010-07-26 21:14:51

0

我不确定这是否可行,但您可以试试看。这有点痛苦,但我确实得到了它。

步骤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象线:

山口.CleanName =清理(col。名称);

更改为:

col.CleanName =清理(col.Name,tbl.Name);

步骤3 这是哪里痛真正开始。抓斗的源代码SubSonic.Core(是:()和在DatabaseTable.cs改变

public IColumn GetColumnByPropertyName(string PropertyName) 

public virtual IColumn GetColumnByPropertyName(string PropertyName) 

步骤4 在结构中。 tt

public static string <#= col.CleanName#> Column { get { return“<#= 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文件这样做后。