2010-02-19 19 views
1

在諮詢任務中,他們使用的是使用T4代碼模板引擎(而不是像2.x那樣的CodeSmith)的Subsonic 3.x(最新版本)VS2008 T4有很多表的DB的Subsonic錯誤System.Runtime.Remoting.RemotingException

當我們在有大約1000個表的DBMS上運行它時,我們遇到了生成Structs.cs文件的錯誤。 T4/Subsonic在較小的DB上生成罰款......

運行轉換代碼時引發異常。該過程無法繼續。下引發的異常:

System.Runtime.Remoting.RemotingException:對象 「/f9ce56f8_409c_4465_b81c_5272c8d764dc/dbet1oh1u2djvp2ildubn9nb_25.rem」 已斷開或在服務器上不存在。 在Microsoft.VisualStudio.TextTemplating.TransformationRunner.get_Errors() 在Microsoft.VisualStudio.TextTemplating.Engine.CompileAndRunCode(字符串 generatorCode,ITextTemplatingEngineHost主機, TemplateProcessingSession會話) C:\用戶\ BlahBlahUserName \文檔\ Visual Studio的 2008 \ EdsTry \ EdSub \ ActiveRecord的\ Structs.tt

這導致了兩個問題

  1. 有沒有人看到這一點,知道的任何變通辦法當T4上 大文件炸燬?

  2. 一旦我解決我可以修改亞音速所以它產生較少 文件(比如1000個的文件,而不是1個大的類文件)

Vstudio電抗器上產生,如果我們大量的類文件在我們的主項目中包含Subsonic generation stiuff,所以我們在單獨的項目中進行並參考生成的DLL,但肯定必須有一種方法可以從亞音速生成幾百個類文件,其中包含數百個類的1 文件。

回答

0

你的問題是你的數據庫連接超時,你最好的最好的辦法是工作的本地數據庫服務器而不是遠程,所以你不等待數據所有的時間。

此外,如果您查看TT文件,您會注意到它會獲取所有表的列表,循環遍歷這些表,然後遍歷字段,TT文件是一個用於從模板創建類的文件,而不是創建文件並將它們保存在某個地方。

但是,如果你的數據庫如此龐大以至於你有超過1000個表格,我認爲你會更好地從數據庫設計開始,並且可能將表格分成一組數據庫,並且有多個通道,IE是產品數據庫,一個人的數據庫等,這種方式,你會保持它很小 ,仍然能夠使用它們,如果這是有意義的

0

我有同樣的問題,並發現這個錯誤是由於連接超時引起的。

這是我如何連接到數據庫以檢索所有實體/視圖/過程/等。:

ServerConnection conn = new ServerConnection(serverName, serverLogin, serverPwd); 
conn.ConnectTimeout = 0; 
conn.StatementTimeout = 0; 
Server server = new Server(conn); 
Database database = new Database(server, databaseName); 
database.Refresh(); 

// ... 

關鍵時刻是要設置這兩個參數:

conn.ConnectTimeout = 0; 
conn.StatementTimeout = 0; 

設置這些我發電機運作良好後。

希望它能爲你工作。

0

如果您的軟件不需要全部1000個表格,那麼您可以將黑名單「ExcludeTables」變成白名單「IncludeTables」,並在* .tt文件中查找/替換所有「!ExcludeTables」和「IncludeTables」。另外,我在SQLServer.ttinclude改變了LoadTables()來檢查我的白名單中它的任何其他呼叫,並添加表之前:

while(rdr.Read()){ 
      Table tbl=new Table(); 
      tbl.Name=rdr["TABLE_NAME"].ToString(); 
      // check table whitelist 
      if (IncludeTables.Contains(tbl.Name) 
    { 
    tbl.Schema=rdr["TABLE_SCHEMA"].ToString(); 
    tbl.Columns=LoadColumns(tbl); 
    tbl.PrimaryKey=GetPK(tbl.Name); 
    tbl.CleanName=CleanUp(tbl.Name); 
    tbl.ClassName=Inflector.MakeSingular(tbl.CleanName); 
    tbl.QueryableName=Inflector.MakePlural(tbl.ClassName); 

    //set the PK for the columns 
    var pkColumn=tbl.Columns.SingleOrDefault(x=>x.Name.ToLower().Trim()==tbl.PrimaryKey.ToLower().Trim()); 
    if(pkColumn!=null) 
    pkColumn.IsPK=true; 

    tbl.FKTables=LoadFKTables(tbl.Name); 
    result.Add(tbl); 
    } 
     } 

我也做了同樣的存儲過程GetSPs()在SQLServer.ttinclude :

// Check SP whitelist too 
if(spType=="PROCEDURE" && IncludeSPs.Contains(sp.Name) &! sp.Name.StartsWith("sp_")){ 

     sp.CleanName=CleanUp(sp.Name); 

      sp.Parameters=GetSPParams(sp.Name); 
      result.Add(sp);   
     } 

現在所有* .tt執行沒有遠程處理異常。