博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用T4模板生成POCO类
阅读量:6292 次
发布时间:2019-06-22

本文共 26058 字,大约阅读时间需要 86 分钟。

为什么叫T4?因为简写为4个T。

T4()是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,比如MVC的视图模板,Entity Framwork的DataContext模板等等。

若论灵活性,各种代码生成工具还真不如T4模板。

在VS2013种默认没有了T4模板,取而代之的是文本模板,但是他们的后缀名都是.tt。我们可以通过NuGet安装T4模板。

安装之后,我们在项目中新建项的时候,在VS模板中就多了两项和T4模板相关的模板。

当我们在新建的T4模板中进行代码编写的时候,默认是没有智能提示的,我们需要再安装一个T4Editor的VS插件tangibleT4EditorPlusModellingToolsVS2013.msi。

下载地址:

 由于我这里用的是VS2013,所以按照13的插件,安装插件时先关闭VS,安装完成之后在T4模板中编写代码时就有了智能提示了。

关于T4模板的详细讲解,大家可以参照一下博客文章:

我这里要说的是,如何在项目中替代其它的代码工具来使用,比如说,自动生成数据库中的POCO类。

 思路:1、我们要查询中数据库中的表和字段。2、根据数据表名才,将其生成多个POCO类文件

How to do?

开发环境:VS2013

准备工作:添加必须的程序集引用

在自己电脑上面用everythin找到Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll,然后添加引用,如果没有,你就网上下载一个。

方式一

 1、添加一个T4模板文件DbHelper,将其后缀修改为.ttinclude,因为我是将其作为内嵌的T4文件,不修改扩展名的话,会将其当成T4模板文件进行生成。

<#+    public class DbHelper    {        #region GetDbTables                public static List
GetDbTables(string connectionString, string database, string tables = null) { if (!string.IsNullOrEmpty(tables)) { tables = string.Format(" and obj.name in ('{0}')", tables.Replace(",", "','")); } #region SQL string sql = string.Format(@"SELECT obj.name tablename, schem.name schemname, idx.rows, CAST ( CASE WHEN (SELECT COUNT(1) FROM sys.indexes WHERE object_id= obj.OBJECT_ID AND is_primary_key=1) >=1 THEN 1 ELSE 0 END AS BIT) HasPrimaryKey from {0}.sys.objects obj inner join {0}.dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1 INNER JOIN {0}.sys.schemas schem ON obj.schema_id=schem.schema_id where type='U' {1} order by obj.name", database, tables); #endregion DataTable dt = GetDataTable(connectionString, sql); return dt.Rows.Cast
().Select(row => new DbTable { TableName = row.Field
("tablename"), SchemaName = row.Field
("schemname"), Rows = row.Field
("rows"), HasPrimaryKey = row.Field
("HasPrimaryKey") }).ToList(); } #endregion #region GetDbColumns public static List
GetDbColumns(string connectionString, string database, string tableName, string schema = "dbo") { #region SQL string sql = string.Format(@" WITH indexCTE AS ( SELECT ic.column_id, ic.index_column_id, ic.object_id FROM {0}.sys.indexes idx INNER JOIN {0}.sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id WHERE idx.object_id =OBJECT_ID(@tableName) AND idx.is_primary_key=1 ) select colm.column_id ColumnID, CAST(CASE WHEN indexCTE.column_id IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey, colm.name ColumnName, systype.name ColumnType, colm.is_identity IsIdentity, colm.is_nullable IsNullable, cast(colm.max_length as int) ByteLength, ( case when systype.name='nvarchar' and colm.max_length>0 then colm.max_length/2 when systype.name='nchar' and colm.max_length>0 then colm.max_length/2 when systype.name='ntext' and colm.max_length>0 then colm.max_length/2 else colm.max_length end ) CharLength, cast(colm.precision as int) Precision, cast(colm.scale as int) Scale, prop.value Remark from {0}.sys.columns colm inner join {0}.sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id left join {0}.sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id LEFT JOIN indexCTE ON colm.column_id=indexCTE.column_id AND colm.object_id=indexCTE.object_id where colm.object_id=OBJECT_ID(@tableName) order by colm.column_id", database); #endregion SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, 100) { Value = string.Format("{0}.{1}.{2}", database, schema, tableName) }; DataTable dt = GetDataTable(connectionString, sql, param); return dt.Rows.Cast
().Select(row => new DbColumn() { ColumnID = row.Field
("ColumnID"), IsPrimaryKey = row.Field
("IsPrimaryKey"), ColumnName = row.Field
("ColumnName"), ColumnType = row.Field
("ColumnType"), IsIdentity = row.Field
("IsIdentity"), IsNullable = row.Field
("IsNullable"), ByteLength = row.Field
("ByteLength"), CharLength = row.Field
("CharLength"), Scale = row.Field
("Scale"), Remark = row["Remark"].ToString() }).ToList(); } #endregion #region GetDataTable public static DataTable GetDataTable(string connectionString, string commandText, params SqlParameter[] parms) { using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = connection.CreateCommand(); command.CommandText = commandText; command.Parameters.AddRange(parms); SqlDataAdapter adapter = new SqlDataAdapter(command); DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } #endregion } #region DbTable ///
/// 表结构 /// public sealed class DbTable { ///
/// 表名称 /// public string TableName { get; set; } ///
/// 表的架构 /// public string SchemaName { get; set; } ///
/// 表的记录数 /// public int Rows { get; set; } ///
/// 是否含有主键 /// public bool HasPrimaryKey { get; set; } } #endregion #region DbColumn ///
/// 表字段结构 /// public sealed class DbColumn { ///
/// 字段ID /// public int ColumnID { get; set; } ///
/// 是否主键 /// public bool IsPrimaryKey { get; set; } ///
/// 字段名称 /// public string ColumnName { get; set; } ///
/// 字段类型 /// public string ColumnType { get; set; } ///
/// 数据库类型对应的C#类型 /// public string CSharpType { get { return SqlServerDbTypeMap.MapCsharpType(ColumnType); } } ///
/// /// public Type CommonType { get { return SqlServerDbTypeMap.MapCommonType(ColumnType); } } ///
/// 字节长度 /// public int ByteLength { get; set; } ///
/// 字符长度 /// public int CharLength { get; set; } ///
/// 小数位 /// public int Scale { get; set; } ///
/// 是否自增列 /// public bool IsIdentity { get; set; } ///
/// 是否允许空 /// public bool IsNullable { get; set; } ///
/// 描述 /// public string Remark { get; set; } } #endregion #region SqlServerDbTypeMap public class SqlServerDbTypeMap { public static string MapCsharpType(string dbtype) { if (string.IsNullOrEmpty(dbtype)) return dbtype; dbtype = dbtype.ToLower(); string csharpType = "object"; switch (dbtype) { case "bigint": csharpType = "long"; break; case "binary": csharpType = "byte[]"; break; case "bit": csharpType = "bool"; break; case "char": csharpType = "string"; break; case "date": csharpType = "DateTime"; break; case "datetime": csharpType = "DateTime"; break; case "datetime2": csharpType = "DateTime"; break; case "datetimeoffset": csharpType = "DateTimeOffset"; break; case "decimal": csharpType = "decimal"; break; case "float": csharpType = "double"; break; case "image": csharpType = "byte[]"; break; case "int": csharpType = "int"; break; case "money": csharpType = "decimal"; break; case "nchar": csharpType = "string"; break; case "ntext": csharpType = "string"; break; case "numeric": csharpType = "decimal"; break; case "nvarchar": csharpType = "string"; break; case "real": csharpType = "Single"; break; case "smalldatetime": csharpType = "DateTime"; break; case "smallint": csharpType = "short"; break; case "smallmoney": csharpType = "decimal"; break; case "sql_variant": csharpType = "object"; break; case "sysname": csharpType = "object"; break; case "text": csharpType = "string"; break; case "time": csharpType = "TimeSpan"; break; case "timestamp": csharpType = "byte[]"; break; case "tinyint": csharpType = "byte"; break; case "uniqueidentifier": csharpType = "Guid"; break; case "varbinary": csharpType = "byte[]"; break; case "varchar": csharpType = "string"; break; case "xml": csharpType = "string"; break; default: csharpType = "object"; break; } return csharpType; } public static Type MapCommonType(string dbtype) { if (string.IsNullOrEmpty(dbtype)) return Type.Missing.GetType(); dbtype = dbtype.ToLower(); Type commonType = typeof(object); switch (dbtype) { case "bigint": commonType = typeof(long); break; case "binary": commonType = typeof(byte[]); break; case "bit": commonType = typeof(bool); break; case "char": commonType = typeof(string); break; case "date": commonType = typeof(DateTime); break; case "datetime": commonType = typeof(DateTime); break; case "datetime2": commonType = typeof(DateTime); break; case "datetimeoffset": commonType = typeof(DateTimeOffset); break; case "decimal": commonType = typeof(decimal); break; case "float": commonType = typeof(double); break; case "image": commonType = typeof(byte[]); break; case "int": commonType = typeof(int); break; case "money": commonType = typeof(decimal); break; case "nchar": commonType = typeof(string); break; case "ntext": commonType = typeof(string); break; case "numeric": commonType = typeof(decimal); break; case "nvarchar": commonType = typeof(string); break; case "real": commonType = typeof(Single); break; case "smalldatetime": commonType = typeof(DateTime); break; case "smallint": commonType = typeof(short); break; case "smallmoney": commonType = typeof(decimal); break; case "sql_variant": commonType = typeof(object); break; case "sysname": commonType = typeof(object); break; case "text": commonType = typeof(string); break; case "time": commonType = typeof(TimeSpan); break; case "timestamp": commonType = typeof(byte[]); break; case "tinyint": commonType = typeof(byte); break; case "uniqueidentifier": commonType = typeof(Guid); break; case "varbinary": commonType = typeof(byte[]); break; case "varchar": commonType = typeof(string); break; case "xml": commonType = typeof(string); break; default: commonType = typeof(object); break; } return commonType; } } #endregion #>
View Code

上面的代码就是查询数据库中的表和字段。

2、同样添加另一个T4模板文件,并修改后缀名Manager.ttinclude

<#@ assembly name="System.Data.Linq"#><#@ assembly name="EnvDTE"#><#@ assembly name="System.Xml"#><#@ assembly name="System.Xml.Linq"#><#@ import namespace="System.Collections.Generic"#><#@ import namespace="System.IO"#><#@ import namespace="System.Text"#><#@ import namespace="Microsoft.VisualStudio.TextTemplating"#><#+// https://raw.github.com/damieng/DamienGKit// http://damieng.com/blog/2009/11/06/multiple-outputs-from-t4-made-easy-revisited// Manager class records the various blocks so it can split them upclass Manager {    private class Block {        public String Name;        public int Start, Length;        public bool IncludeInDefault;    }    private Block currentBlock;    private readonly List
files = new List
(); private readonly Block footer = new Block(); private readonly Block header = new Block(); private readonly ITextTemplatingEngineHost host; private readonly StringBuilder template; protected readonly List
generatedFileNames = new List
(); public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) { return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template); } public void StartNewFile(String name) { if (name == null) throw new ArgumentNullException("name"); CurrentBlock = new Block { Name = name }; } public void StartFooter(bool includeInDefault = true) { CurrentBlock = footer; footer.IncludeInDefault = includeInDefault; } public void StartHeader(bool includeInDefault = true) { CurrentBlock = header; header.IncludeInDefault = includeInDefault; } public void EndBlock() { if (CurrentBlock == null) return; CurrentBlock.Length = template.Length - CurrentBlock.Start; if (CurrentBlock != header && CurrentBlock != footer) files.Add(CurrentBlock); currentBlock = null; } public virtual void Process(bool split, bool sync = true) { if (split) { EndBlock(); String headerText = template.ToString(header.Start, header.Length); String footerText = template.ToString(footer.Start, footer.Length); String outputPath = Path.GetDirectoryName("host.TemplateFile"); files.Reverse(); if (!footer.IncludeInDefault) template.Remove(footer.Start, footer.Length); foreach(Block block in files) { String fileName = Path.Combine(outputPath, block.Name); String content = headerText + template.ToString(block.Start, block.Length) + footerText; generatedFileNames.Add(fileName); CreateFile(fileName, content); template.Remove(block.Start, block.Length); } if (!header.IncludeInDefault) template.Remove(header.Start, header.Length); } } protected virtual void CreateFile(String fileName, String content) { if (IsFileContentDifferent(fileName, content)) File.WriteAllText(fileName, content); } public virtual String GetCustomToolNamespace(String fileName) { return null; } public virtual String DefaultProjectNamespace { get { return null; } } protected bool IsFileContentDifferent(String fileName, String newContent) { return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent); } private Manager(ITextTemplatingEngineHost host, StringBuilder template) { this.host = host; this.template = template; } private Block CurrentBlock { get { return currentBlock; } set { if (CurrentBlock != null) EndBlock(); if (value != null) value.Start = template.Length; currentBlock = value; } } private class VSManager: Manager { private readonly EnvDTE.ProjectItem templateProjectItem; private readonly EnvDTE.DTE dte; private readonly Action
checkOutAction; private readonly Action
> projectSyncAction; public override String DefaultProjectNamespace { get { return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString(); } } public override String GetCustomToolNamespace(string fileName) { return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString(); } public override void Process(bool split, bool sync) { if (templateProjectItem.ProjectItems == null) return; base.Process(split, sync); if (sync) projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null)); } protected override void CreateFile(String fileName, String content) { if (IsFileContentDifferent(fileName, content)) { CheckoutFileIfRequired(fileName); File.WriteAllText(fileName, content); } } internal VSManager(ITextTemplatingEngineHost host, StringBuilder template) : base(host, template) { var hostServiceProvider = (IServiceProvider)host; if (hostServiceProvider == null) throw new ArgumentNullException("Could not obtain IServiceProvider"); dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); if (dte == null) throw new ArgumentNullException("Could not obtain DTE from host"); templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile); checkOutAction = fileName => dte.SourceControl.CheckOutItem(fileName); projectSyncAction = keepFileNames => ProjectSync(templateProjectItem, keepFileNames); } private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, List
keepFileNames) { var keepFileNameSet = new HashSet
(keepFileNames); var projectFiles = new Dictionary
(); var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.FileNames[0]) + "."; foreach (EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) projectFiles.Add(projectItem.FileNames[0], projectItem); // Remove unused items from the project foreach (var pair in projectFiles) if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix)) pair.Value.Delete(); // Add missing files to the project foreach(String fileName in keepFileNameSet) if (!projectFiles.ContainsKey(fileName)) templateProjectItem.ProjectItems.AddFromFile(fileName); } private void CheckoutFileIfRequired(String fileName) { var sc = dte.SourceControl; if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName)) checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null)); } }} #>
View Code

上面的代码是用来生成多文件的。

3、新建T4模板文件PocoManager.tt,然后引入上面两个ttinclude文件。

<#@ template debug="false" hostspecific="true" language="C#" #><#@ assembly name="System.Data" #><#@ assembly name="System.Data.DataSetExtensions.dll" #><#@ assembly name="System.xml" #><#@ import namespace="System" #><#@ import namespace="System.Xml" #><#@ import namespace="System.Collections.Generic" #><#@ import namespace="System.Data" #><#@ import namespace="System.Data.SqlClient" #><#@ import namespace="System.IO" #><#@ assembly name="System.Core" #><#@ import namespace="System.Linq" #><#@include file="$(ProjectDir)Models\DbHelper.ttinclude"#> <#@include file="$(ProjectDir)Models\Manager.ttinclude"#> <# var manager = Manager.Create(Host, GenerationEnvironment); #><# manager.StartHeader(); #>using System;using System.Collections.Generic;namespace My.Model{   <# manager.EndBlock(); #><#            foreach (DbTable db in DbHelper.GetDbTables(config.ConnectionString, config.DbDatabase))    {            string tb_name=db.TableName;        manager.StartNewFile(tb_name+".cs");#>    ///     /// 实体-<#=tb_name#>     ///    public partial class <#=tb_name#>    {        <# foreach(DbColumn column in DbHelper.GetDbColumns(config.ConnectionString, config.DbDatabase, tb_name)){#>///         /// <#=column.Remark#>        ///                 public <#= column.CSharpType#><# if(column.CommonType.IsValueType && column.IsNullable){#>?<#}#> <#=column.ColumnName#> { get; set; }<#}#>       }<#//manager.EndBlock();        }                //conn.Close();  #><# manager.StartFooter(); #>}<# manager.EndBlock(); #><# manager.Process(true); #><#+    public class config    {        public static readonly string ConnectionString="Data Source=(local);Integrated Security=true;Initial Catalog=CarSYS;";        public static readonly string DbDatabase="CarSYS";    }#>
View Code

按Ctrl+S生成的代码如下:

using System;using System.Collections.Generic;namespace My.Model{       ///     /// 实体-Brand     ///    public partial class Brand    {        ///         /// 编号        ///                 public int BrandId { get; set; }        ///         ///         ///                 public string BrandName { get; set; }               }    ///     /// 实体-Car     ///    public partial class Car    {        ///         /// 编号        ///                 public int CarId { get; set; }        ///         /// 车名称        ///                 public string CarName { get; set; }        ///         /// 品牌编号        ///                 public int? BrandId { get; set; }        ///         /// 实体图的文件名        ///                 public string Picture { get; set; }        ///         /// 官方价        ///                 public decimal OfficialPrice { get; set; }        ///         /// 点击率        ///                 public int? Click { get; set; }               }    ///     /// 实体-Product     ///    public partial class Product    {        ///         ///         ///                 public Guid Id { get; set; }        ///         ///         ///                 public string NAME { get; set; }        ///         ///         ///                 public decimal Price { get; set; }               }}
View Code

方式二

操作方式一种的步骤2,然后新建T4模板Manager.tt,引入Manager.ttinclude

<#@ template debug="false" hostspecific="true" language="C#" #><#@ assembly name="System.Data" #><#@ assembly name="System.xml" #><#@ import namespace="System.Collections.Generic" #><#@ import namespace="System.Data.SqlClient" #><#@ import namespace="System.Data" #><#@ assembly name="System.Core" #><#@ import namespace="System.Linq" #><#@include file="$(ProjectDir)Models\Manager.ttinclude"#> <# var manager = Manager.Create(Host, GenerationEnvironment); #><# manager.StartHeader(); #>using System;using System.Collections.Generic;namespace My.Model{   <# manager.EndBlock(); #><#            string connectionString= "server=localhost;database=CarSYS;uid=sa;pwd=1127;";            SqlConnection conn = new SqlConnection(connectionString);    conn.Open();        string selectQuery ="SET FMTONLY ON; select * from @tableName; SET FMTONLY OFF;";    SqlCommand command = new SqlCommand(selectQuery,conn);    SqlDataAdapter ad = new SqlDataAdapter(command);    System.Data.DataSet ds = new DataSet();     System.Data.DataTable schema = conn.GetSchema("Tables");    foreach(System.Data.DataRow row in schema.Rows)    {            ds.Tables.Clear();        string tb_name =row["TABLE_NAME"].ToString().Replace(" ","_");         string tb_type=row["TABLE_TYPE"].ToString();        if(tb_type!="BASE TABLE")        {                  continue;        }         command.CommandText = selectQuery.Replace("@tableName","["+row["TABLE_NAME"].ToString()+"]");        ad.FillSchema(ds,SchemaType.Mapped,tb_name);          manager.StartNewFile(tb_name+".cs");#>    ///     /// 实体-<#=tb_name#>     ///     public partial class <#=tb_name#>        {            <#        //PushIndent("        ");        foreach (DataColumn dc in ds.Tables[0].Columns)         {            string dataTypeName=dc.DataType.Name=="Byte[]"?"DateTime":dc.DataType.Name;        #>        ///         /// <#=dc#>        ///         <#             WriteLine("public " + dataTypeName + (dc.AllowDBNull && dataTypeName.ToLower() != "string" ? "? ": " ") + dc.ColumnName + " { get; set; }");        }        PopIndent();        #>    } <#        manager.EndBlock();        }                conn.Close();  #><# manager.StartFooter(); #>}<# manager.EndBlock(); #><# manager.Process(true); #>
View Code

按Ctrl+S生成的代码如下:

using System;using System.Collections.Generic;namespace My.Model{       ///     /// 实体-Brand     ///     public partial class Brand        {                    ///         /// BrandId        ///         public Int32 BrandId { get; set; }        ///         /// BrandName        ///         public String BrandName { get; set; }    }     ///     /// 实体-Car     ///     public partial class Car        {                    ///         /// CarId        ///         public Int32 CarId { get; set; }        ///         /// CarName        ///         public String CarName { get; set; }        ///         /// BrandId        ///         public Int32? BrandId { get; set; }        ///         /// Picture        ///         public String Picture { get; set; }        ///         /// OfficialPrice        ///         public Decimal OfficialPrice { get; set; }        ///         /// Click        ///         public Int32? Click { get; set; }    }     ///     /// 实体-Product     ///     public partial class Product        {                    ///         /// Id        ///         public Guid Id { get; set; }        ///         /// NAME        ///         public String NAME { get; set; }        ///         /// Price        ///         public Decimal Price { get; set; }    } }
View Code

数据库CarSYS的脚本下载地址:

USE [master]GO/****** Object:  Database [CarSYS]    Script Date: 2/17/2017 5:33:04 PM ******/CREATE DATABASE [CarSYS] CONTAINMENT = NONE ON  PRIMARY ( NAME = N'CarSYS', FILENAME = N'F:\DatabaseFile\CarSYS.mdf' , SIZE = 212992KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'CarSYS_log', FILENAME = N'F:\DatabaseFile\CarSYS_log.ldf' , SIZE = 321088KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GOALTER DATABASE [CarSYS] SET COMPATIBILITY_LEVEL = 110GOIF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))beginEXEC [CarSYS].[dbo].[sp_fulltext_database] @action = 'enable'endGOALTER DATABASE [CarSYS] SET ANSI_NULL_DEFAULT OFF GOALTER DATABASE [CarSYS] SET ANSI_NULLS OFF GOALTER DATABASE [CarSYS] SET ANSI_PADDING OFF GOALTER DATABASE [CarSYS] SET ANSI_WARNINGS OFF GOALTER DATABASE [CarSYS] SET ARITHABORT OFF GOALTER DATABASE [CarSYS] SET AUTO_CLOSE OFF GOALTER DATABASE [CarSYS] SET AUTO_CREATE_STATISTICS ON GOALTER DATABASE [CarSYS] SET AUTO_SHRINK OFF GOALTER DATABASE [CarSYS] SET AUTO_UPDATE_STATISTICS ON GOALTER DATABASE [CarSYS] SET CURSOR_CLOSE_ON_COMMIT OFF GOALTER DATABASE [CarSYS] SET CURSOR_DEFAULT  GLOBAL GOALTER DATABASE [CarSYS] SET CONCAT_NULL_YIELDS_NULL OFF GOALTER DATABASE [CarSYS] SET NUMERIC_ROUNDABORT OFF GOALTER DATABASE [CarSYS] SET QUOTED_IDENTIFIER OFF GOALTER DATABASE [CarSYS] SET RECURSIVE_TRIGGERS OFF GOALTER DATABASE [CarSYS] SET  DISABLE_BROKER GOALTER DATABASE [CarSYS] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GOALTER DATABASE [CarSYS] SET DATE_CORRELATION_OPTIMIZATION OFF GOALTER DATABASE [CarSYS] SET TRUSTWORTHY OFF GOALTER DATABASE [CarSYS] SET ALLOW_SNAPSHOT_ISOLATION OFF GOALTER DATABASE [CarSYS] SET PARAMETERIZATION SIMPLE GOALTER DATABASE [CarSYS] SET READ_COMMITTED_SNAPSHOT OFF GOALTER DATABASE [CarSYS] SET HONOR_BROKER_PRIORITY OFF GOALTER DATABASE [CarSYS] SET RECOVERY FULL GOALTER DATABASE [CarSYS] SET  MULTI_USER GOALTER DATABASE [CarSYS] SET PAGE_VERIFY CHECKSUM  GOALTER DATABASE [CarSYS] SET DB_CHAINING OFF GOALTER DATABASE [CarSYS] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GOALTER DATABASE [CarSYS] SET TARGET_RECOVERY_TIME = 0 SECONDS GOALTER DATABASE [CarSYS] SET  READ_WRITE GO
View Code

扩展:我们还可以在搭建项目框架的时候,通过反射等技术来自己编写T4模板。

当然,我们还可以通过这个开发神器来生成我们的EF Code代码。

转载地址:http://hdcta.baihongyu.com/

你可能感兴趣的文章
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>
如何清理mac系统垃圾
查看>>
企业中最佳虚拟机软件应用程序—Parallels Deskto
查看>>
Nginx配置文件详细说明
查看>>
怎么用Navicat Premium图标编辑器创建表
查看>>
Spring配置文件(2)配置方式
查看>>
MariaDB/Mysql 批量插入 批量更新
查看>>
ItelliJ IDEA开发工具使用—创建一个web项目
查看>>
solr-4.10.4部署到tomcat6
查看>>
切片键(Shard Keys)
查看>>
淘宝API-类目
查看>>