Entity Framework6 的T4模板

截止于2015年9月,微软最新的ORM框架是Entity Framework6。我们将为EF6框架制作自动代码生成器。
实例:当前业务有十几个实体,需要为每个实体生成业务层的接口,如下所示

 1 namespace IBLL
 2 {
 3     public partial interface IBill_LeaveBLL : IBaseBLL<MODEL.Bill_Leave>
 4     {
 5     }
 6     public partial interface IOu_DepartmentBLL : IBaseBLL<MODEL.Ou_Department>
 7     {
 8     }
 9     public partial interface IOu_PermissionBLL : IBaseBLL<MODEL.Ou_Permission>
10     {
11     }
12     public partial interface IOu_RoleBLL : IBaseBLL<MODEL.Ou_Role>
13     {
14     }
15     public partial interface IOu_RolePermissionBLL : IBaseBLL<MODEL.Ou_RolePermission>
16     {
17     }
18  //omit 1000 Lines~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
19 }
显然,自己用手敲会累死~~~

注意<#@ include file="EF6.Utility.CS.ttinclude"#>指令,我们使用微软为EF6提供的ttinclude工具,来获取EF6 edmx文件的详细信息,下面是T4模板代码:

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
 output extension=".cs"#><#
    const string inputFile = @"../MODEL/OuOA.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
EdmMetadataLoader loader=new EdmMetadataLoader(textTransform.Host, textTransform.Errors);
EdmItemCollection itemCollection = (EdmItemCollection)loader.CreateEdmItemCollection(inputFile);
    //itemCollection.CreateEdmItemCollection(inputFile);
    
#>
namespace IBLL
{
<#
    foreach(EntityType entity in itemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
        {
 #>
    public partial interface I<#=entity.Name#>BLL : IBaseBLL<MODEL.<#=entity.Name#>>
    {
    }
<#}#>
}
<#+ 
public static void ArgumentNotNull<T>(T arg, string name) where T : class
{
    if (arg == null)
    {
        throw new ArgumentNullException(name);
    }
}
#>

注意,与之前版本EF不同的是,必须要添加这个ArgumentNotNull方法(这个方法是用来判断你自己调用的那些方法传递的参数不是空,比如EdmItemCollection itemCollection = (EdmItemCollection)loader.CreateEdmItemCollection(inputFile);ttinclude源码会查看这个参数不是空)。
除此以外与之前的ttinclude稍微有一点区别,比如方法做过了改写等等,使用时要注意。

posted @ 2015-09-30 23:56  高手高手高高手  阅读(1088)  评论(0)    收藏  举报