Subsonic 亚音速在运行时查询信息模式

Subsonic 亚音速在运行时查询信息模式,subsonic,information-schema,Subsonic,Information Schema,我在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,

我在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=新的亚音速.Select();
SubSonic.SqlQuery
查询3.Where(“[MY_TABLE_NAME_IS_PRIVATE]”)。IsEqualTo(“[MY_TABLE_NAME_IS_PRIVATE]”);
List subsecList3=query3.ExecuteTypedList();
调用
query3.Where(…)
时,将调用
GetSTableSchema
(使用SQL分析器捕获它)

我的第一个问题是:为什么亚音速在看这个模式?它在生成我的数据层时构建了模式、类和关系

我的第二个问题是:我能让它停止吗?这是可配置的吗

发件人:

在运行时,亚音速(至少2.x)不依赖任何真正的外键存在。信息模式仅在DAL生成期间查询

这是真的吗?我的配置可能有问题吗


我正在使用ShareDBConnectionScope,因为有多个数据库具有类似的模式,但有一些自定义表。

我也遇到了同样的问题

在我第一次调用亚音速之前,我将此代码放入了我的应用程序中

这将从生成的代码中加载模式,而不是在运行时查询信息\u模式

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(我更喜欢一个异常并修复代码)

//
///获取表架构。
/// 
///表的名称。
///表的类型。
/// 
public override TableSchema.Table GetTableSchema(字符串tableName,TableType TableType)
{
if(schemaCollection.ContainsKey(表名))
返回schemaCollection[表名];
//避免在运行时查询信息\u schema
if(DataService.Provider.Name==“MyProviderName”)
抛出新的InvalidOperationException(“在运行时查询信息_架构不是一个好主意。调用方应该使用DataService.GetTableSchema(tableName,providerName)而不是DataService.Provider.GetTableSchema(providerName)来强制使用缓存的TableSchema定义”);

第二个代码块中缺少代码,这是不编译的。请确认<代码> [MyLaTabLeLayNAME.IsHub] 不仅是一个表名,而且是一个合格的列名。考虑用修改的表和列名发布实际代码。
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);
    }

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