转换 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);    
   } #> 

转换 T4 模板以连接到 MySQL 数据库

我在 VS 扩展(T4 Awesome)中使用了数据库模式读取器项目来访问数据库结构。 它支持任何 ADO 提供程序。您可以在此处下载 MySql 提供程序。 数据库模式读取器项目的文档非常好,因此您应该能够使用它们来确定如何连接到数据库并读取结构。

正如我所说,我在我的扩展中实现了这个,所以如果你想要一个快速的解决方案,你可以下载它并试一试。 如果没有,您几乎以与现有方式相同的方式执行此操作,但引用数据库架构读取器项目命名空间和程序集。