转换 T4 模板以连接到 MySQL 数据库
本文关键字:MySQL 数据库 连接 T4 转换 | 更新日期: 2024-11-01 02:56:51
我在连接到SqlServer database and generates POCO classes from the tables
的 http://www.haneycodes.net/automatically-generate-pocos-from-db-with-t4/中找到了以下T4 Template
。 我想对MySql
做同样的事情,但我不确定我需要改变什么。我尝试只连接MySqlConnection,但这不起作用。 我是否必须创建 MySql 服务器实例? 如果有人知道使用 MySQL 创建 POCO 的替代方案,我也对此持开放态度。
<#@ template language="C#" hostspecific="true" debug="True" #>
<#@ assembly name="System.Core" #> <#@ assembly name="System.Data" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#
string sqlServer = "9.9.9.9";
string sqlLogin = "admin";
string sqlPassword = "password";
string sqlDatabase = "MyDatabase";
string classNamespace = "Your.Namespace.Here";
string destinationFolder = "PocoFolder";
Server server = new Server(sqlServer);
server.ConnectionContext.LoginSecure = false;
server.ConnectionContext.Login = sqlLogin;
server.ConnectionContext.Password = sqlPassword;
server.ConnectionContext.Connect();
foreach (Table table in server.Databases[sqlDatabase].Tables)
{
if (table.Name.StartsWith("sys"))
{
continue;
} #>
using System;
namespace <#= classNamespace #>
{
public class <#= table.Name #>
{ <#
int columnCount = table.Columns.Count;
int i = 0;
foreach (Column col in table.Columns)
{
i++;
string propertyType = GetNetDataType(col.DataType.Name);
// If we can't map it, skip it
if (string.IsNullOrWhiteSpace(propertyType))
{
// Skip
continue;
}
// Handle nullable columns by making the type nullable
if (col.Nullable && propertyType != "string")
{
propertyType += "?";
} #>
public <#= propertyType #> <#= col.Name #> { get; set; } <#
// Do we insert the space?
if (i != columnCount)
{ #> <#
} #> <#
} #>
}
}
<#
// Write new POCO class to its own file
SaveOutput(table.Name + ".cs", destinationFolder);
} #>
<#+
public static string GetNetDataType(string sqlDataTypeName)
{ switch (sqlDataTypeName.ToLower())
{
case "bigint":
return "Int64";
case "binary":
case "image":
case "varbinary":
return "byte[]";
case "bit":
return "bool";
case "char":
return "char";
case "datetime":
case "smalldatetime":
return "DateTime";
case "decimal":
case "money":
case "numeric":
return "decimal";
case "float":
return "double";
case "int":
return "int";
case "nchar":
case "nvarchar":
case "text":
case "varchar":
case "xml":
return "string";
case "real":
return "single";
case "smallint":
return "Int16";
case "tinyint":
return "byte";
case "uniqueidentifier":
return "Guid";
default:
return null;
}
}
void SaveOutput(string outputFileName, string destinationFolder)
{
// Write to destination folder
string templateDirectory = Path.Combine(Path.GetDirectoryName(Host.TemplateFile), destinationFolder); string outputFilePath = Path.Combine(templateDirectory, outputFileName);
File.Delete(outputFilePath);
File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString());
// Flush generation
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
} #>
我在 VS 扩展(T4 Awesome)中使用了数据库模式读取器项目来访问数据库结构。 它支持任何 ADO 提供程序。您可以在此处下载 MySql 提供程序。 数据库模式读取器项目的文档非常好,因此您应该能够使用它们来确定如何连接到数据库并读取结构。
正如我所说,我在我的扩展中实现了这个,所以如果你想要一个快速的解决方案,你可以下载它并试一试。 如果没有,您几乎以与现有方式相同的方式执行此操作,但引用数据库架构读取器项目命名空间和程序集。