亚音速3.0和大型SQL数据库
有没有办法将生成的代码限制在数据库中的特定表中?我的数据库有几百个表,我真的只想在一整把表上使用亚音速 如果表名与您感兴趣的某个表匹配,您可以修改T4模板以仅限制函数调用。现在,它只是检查排除项。看起来,仅仅添加一个白名单也很简单。试试这个 在Settings.t包括中,复制亚音速3.0和大型SQL数据库,sql,subsonic3,Sql,Subsonic3,有没有办法将生成的代码限制在数据库中的特定表中?我的数据库有几百个表,我真的只想在一整把表上使用亚音速 如果表名与您感兴趣的某个表匹配,您可以修改T4模板以仅限制函数调用。现在,它只是检查排除项。看起来,仅仅添加一个白名单也很简单。试试这个 在Settings.t包括中,复制 string[] ExcludeTables = new string[]{ "sysdiagrams", "BuildVersion", }; 声明,并粘贴一个名为“IncludeTables”的新数组声明。将您的表名
string[] ExcludeTables = new string[]{
"sysdiagrams",
"BuildVersion",
};
声明,并粘贴一个名为“IncludeTables”的新数组声明。将您的表名添加到其中。然后在Structs.tt、ActiveRecord.tt和Context.tt中搜索“ExcludeTables”。无论您在何处找到它,都要为包含的表添加一个检查。所以改变
if(!ExcludeTables.Contains(tbl.Name))
到
这应该让你开始了。沃伦,我也遇到了和你一样的情况。 你可以试试我的解决办法。 我的解决方案是一个表一T4模板 你应该做的是:
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
var tables=LoadTables()代码>并替换为以下代码:
var tableName=System.IO.Path.GetFileName(Host.TemplateFile).Replace(“.tt”,”);
var tables=LoadTables(表名)代码>
顺便说一句:我的英语不是很好,所以…当我做这个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;