2012-01-27 5 views
1

私のWebアプリケーションで亜音速2.2を使用します。私は多くのテーブルを持つデータベースを持っています。 は、あまりにも多くのGetSchemaへの最初の呼び出しは、このクエリで長時間ハング外部キーの数が取得した場合:私はSQLDataProviderでGetTableSchemaコールまで追跡実行時に亜音速の情報スキーマ

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 

。私のコードで

私は動的な列を持つテーブルを追跡して、テーブルを照会しています: (それは重要ことを確認していないアプリで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プロファイラでキャッチ)

私の最初の質問は、なぜサブソニックがスキーマを見ているのですか?私のデータレイヤーを生成するとき、それはスキーマとクラスと関係を構築しましたか?

私の2番目の質問は:私はそれを止めることができますか?これは設定可能ですか?

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

ランタイム亜音速(少なくとも2.xの)ATが存在するために、任意の実際の外部キーには依存しません。情報スキーマは、DAL生成中にのみ照会されます。

これは本当ですか?私の設定で何かが間違っている可能性がありますか?

私はShareDBConnectionScopeを使用しています。これは、類似のスキーマを持つ複数のカスタムテーブルがあるためです。

+0

2番目のコードブロックにコードがありません。これはコンパイルされません。そして、[MY_TABLE_NAME_IS_PRIVATE]はテーブル名だけでなく、修飾されたカラム名であることを確認してください。変更された表名と列名を持つ実際のコードを投稿することを検討してください。 – marapet

答えて

0

私は同じ問題を抱えていました。

私はSubSonicを初めて呼び出す前にこのコードをアプリケーションに配置しました。

これは私は、また、(I例外を好むと、コードを修正する実行時InformationSchemaクエリを避けるためMySqlInnoDbDataProviderの亜音速コードを変更し、生成されたコードではなく、ランタイム

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); 
    } 

} 

で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");