2010-07-22 75 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文件這樣做後。