2012-01-27 48 views
1

我在我的web應用程序中使用亞音速2.2。我有一個包含很多表的數據庫。 當外鍵的數量得到太多的getSchema第一個電話掛了很長時間與此查詢:運行時亞音速查詢信息架構

SELECT 
    FK_Table = FK.TABLE_NAME, 
    FK_Column = CU.COLUMN_NAME, 
    PK_Table = PK.TABLE_NAME, 
    PK_Column = PT.COLUMN_NAME, 
    Constraint_Name = C.CONSTRAINT_NAME, 
    Owner = FK.TABLE_SCHEMA 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN 
    ( 
     SELECT i1.TABLE_NAME, i2.COLUMN_NAME 
     FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
     INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
     WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
    ) 
PT ON PT.TABLE_NAME = PK.TABLE_NAME 

我追查到的SqlDataProvider的GetTableSchema電話。

在我的代碼,我查詢,用於跟蹤與動態列一個表的表: (不知道它的問題只是在程序的第一個查詢到DB)

SubSonic.Select select3 = new SubSonic.Select(); 
SubSonic.SqlQuery 
query3.Where("[MY_TABLE_NAME_IS_PRIVATE]").IsEqualTo("[MY_TABLE_NAME_IS_PRIVATE]"); 
List<[MY_TABLE_NAME_IS_PRIVATE]> subSonicList3 = query3.ExecuteTypedList<[MY_TABLE_NAME_IS_PRIVATE]>(); 

query3.Where(...)被稱爲GetSTableSchema被調用(使用SQL Profiler捕獲它)

我的第一個問題是:爲什麼Subsonic在查看Schema?它在生成我的數據層時構建了模式以及類和關係?

我的第二個問題是:我可以讓它停止嗎?這是可配置的嗎?

來自:With SubSonic is there a way to express relationships without foreign keys?

在運行時亞音速(至少2.X)不依賴於任何真正的外鍵存在。信息模式僅在DAL生成期間被查詢。

這是真的嗎?是否有可能我的配置有問題。

我使用ShareDBConnectionScope由於多個數據庫具有類似架構,但一些自定義表。

+0

在第二個代碼塊中沒有代碼,這不能編譯。請確認'[MY_TABLE_NAME_IS_PRIVATE]'不僅是一個表名,而且是一個合格的列名。考慮發佈修改過的表名和列名的真實代碼。 – marapet 2012-01-28 23:23:40

回答

0

我有同樣的問題。

在我第一次給SubSonic打電話之前,我將這段代碼放入了我的應用程序。

這將加載從所生成的代碼的模式,而不是在運行時

foreach (var type in this.GetType().Assembly.GetExportedTypes()) 
{ 

    if (type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.FullName != null && type.BaseType.FullName.StartsWith("SubSonic.ActiveRecord`1")) 
    { 
     type.GetMethod("GetTableSchema", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, null); 
    } 

} 

我還修改MySqlInnoDbDataProvider運行期間避免InformationSchema查詢的亞音速代碼查詢INFORMATION_SCHEMA(我喜歡一個異常和修復代碼)

/// <summary> 
    /// Gets the table schema. 
    /// </summary> 
    /// <param name="tableName">Name of the table.</param> 
    /// <param name="tableType">Type of the table.</param> 
    /// <returns></returns> 
    public override TableSchema.Table GetTableSchema(string tableName, TableType tableType) 
    { 

     if (schemaCollection.ContainsKey(tableName)) 
      return schemaCollection[tableName]; 

     // Avoid querying the information_schema @ runtime 
     if (DataService.Provider.Name == "MyProviderName") 
      throw new InvalidOperationException("Querying Information_Schema at runtime is not a good idea. The caller should use DataService.GetTableSchema(tableName, providerName) instead of DataService.Provider.GetTableSchema(providerName) to force the use of the cached TableSchema definition");