亚音速3.0和大型SQL数据库

亚音速3.0和大型SQL数据库,sql,subsonic3,Sql,Subsonic3,有没有办法将生成的代码限制在数据库中的特定表中?我的数据库有几百个表,我真的只想在一整把表上使用亚音速 如果表名与您感兴趣的某个表匹配,您可以修改T4模板以仅限制函数调用。现在,它只是检查排除项。看起来,仅仅添加一个白名单也很简单。试试这个 在Settings.t包括中,复制 string[] ExcludeTables = new string[]{ "sysdiagrams", "BuildVersion", }; 声明,并粘贴一个名为“IncludeTables”的新数组声明。将您的表名

有没有办法将生成的代码限制在数据库中的特定表中?我的数据库有几百个表,我真的只想在一整把表上使用亚音速

如果表名与您感兴趣的某个表匹配,您可以修改T4模板以仅限制函数调用。现在,它只是检查排除项。看起来,仅仅添加一个白名单也很简单。试试这个

在Settings.t包括中,复制

string[] ExcludeTables = new string[]{
"sysdiagrams",
"BuildVersion",
};
声明,并粘贴一个名为“IncludeTables”的新数组声明。将您的表名添加到其中。然后在Structs.tt、ActiveRecord.tt和Context.tt中搜索“ExcludeTables”。无论您在何处找到它,都要为包含的表添加一个检查。所以改变

if(!ExcludeTables.Contains(tbl.Name))


这应该让你开始了。

沃伦,我也遇到了和你一样的情况。 你可以试试我的解决办法。 我的解决方案是一个表一T4模板

你应该做的是:

  • 在SQLServer.t目录中,将LoadTables方法替换为以下代码:
  • 列表加载表(参数字符串[]表) { var result=新列表()

    }

  • 在Context.tt中,查找code
    var tables=LoadTables()并替换为以下代码:

    var dir=System.IO.Path.GetDirectoryName(Host.TemplateFile)+“\\Entities”;
    var fileNames=Directory.GetFiles(dir,“*.tt”);
    string[]tableNames=新字符串[fileNames.Length];
    for(int i=0;i

  • 创建一个名为“Entities”的新文件夹,并将Settings.ttinclude和SQLServer.ttinclude复制到新文件夹中

  • 在ActiveRecord.tt中,找到code
    var tables=LoadTables()并替换为以下代码:

    var tableName=System.IO.Path.GetFileName(Host.TemplateFile).Replace(“.tt”,”);
    var tables=LoadTables(表名)

  • 在完成步骤1到步骤4之后,当您想要从指定的表生成新的ActiveRecord类时,您应该做的是:

  • 创建与指定表的tablename同名的新T4模板
  • 将ActiveRecord.tt代码复制到新的T4模板
  • 为新T4模板生成代码
  • 为Context.tt模板生成代码

  • 顺便说一句:我的英语不是很好,所以…

    当我做这个content.cs时,永远不会创建content.cs或structs.cs。运行转换时出现错误5:System.InvalidOperationException:超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小。位于System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)的System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)的System.Data.SqlClient.SqlConnection.Open()这非常有用,谢谢。我在这里发现了类似的实现:
    if(!ExcludeTables.Contains(tbl.Name) 
        && (IncludeTables.Length == 0 || IncludeTables.Contains(tbl.Name))
    
    string sql = TABLE_SQL;
    if(tables.Length > 0)
    {
      StringBuilder sb = new StringBuilder();
      foreach(string table in tables){
        sb.AppendFormat("'{0}',", table);
      }
      sql += " and TABLE_NAME in (" + sb.Remove(sb.Length - 1, 1).ToString() + ")";
    }
    
    //pull the tables in a reader
    using(IDataReader rdr=GetReader(sql))
    {
        while(rdr.Read())
        {
            Table tbl=new Table();
            tbl.Name=rdr["TABLE_NAME"].ToString();
            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);
        }
    }
    
    foreach(Table tbl in result)
    {
        //loop the FK tables and see if there's a match for our FK columns
        foreach(Column col in tbl.Columns)
        {
            col.IsForeignKey=tbl.FKTables.Any(
                x=>x.ThisColumn.Equals(col.Name,StringComparison.InvariantCultureIgnoreCase)
            );
        }
    }
    return result;