首页 > 代码库 > T4 模板代码示例
T4 模板代码示例
本模板可以根据EF框架的edmx文件生成多个Respository类文件
<#@ template language="C#" debug="true" hostspecific="true"#><#@ include file="EF.Utility.CS.ttinclude"#><#@ import namespace="System.IO" #><#@ import namespace="System.Diagnostics" #><#@ output extension=".cs"#><#// This needs to be set to the .edmx file that you want to process.//string edmxFile = FindEDMXFileName(); // @"Model1.edmx";string edmxFile = @"Model.edmx";CodeGenerationTools code = new CodeGenerationTools(this);MetadataLoader loader = new MetadataLoader(this);MetadataTools ef = new MetadataTools(this);#>using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Linq.Expressions; namespace <#= code.VsNamespaceSuggestion() #>{ public interface IRepository<T> { IUnitOfWork UnitOfWork { get; set; } bool IsUseDataFilter{get;set;} IQueryable<T> All(); IQueryable<T> Find(Expression<Func<T, bool>> expression); IQueryable<T> Find(string where , params object[] para); IQueryable<T> Sort(IQueryable<T> source, string sortfield); void Add(T entity); void Delete(T entity); void Save(); void Update(T entity); }}<#EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(edmxFile);EntityContainer container = ItemCollection.GetItems<EntityContainer>().FirstOrDefault();EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)){; fileManager.StartNewFile(entity.Name + "Repository.Generated.cs"); #>using System;using System.Linq;using System.Collections.Generic;// This file is auto generated and will be overwritten as soon as the template is executed// Do not modify this file... namespace <#= code.VsNamespaceSuggestion() #>{ <#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#>Repository { private IRepository<<#=code.Escape(entity)#>> _repository {get;set;} private bool _isUseDataFilter; public IRepository<<#=code.Escape(entity)#>> Repository { get { return _repository; } set { _repository = value; } } public <#=code.Escape(entity)#>Repository(IRepository<<#=code.Escape(entity)#>> repository, IUnitOfWork unitOfWork) { Repository = repository; Repository.UnitOfWork = unitOfWork; IsUseDataFilter = true; } public IQueryable<<#=code.Escape(entity)#>> All() { return Repository.All(); } public void Add(<#=code.Escape(entity)#> entity) { throw new NotImplementedException("This repository does not support the method."); } public void Delete(<#=code.Escape(entity)#> entity) { throw new NotImplementedException("This repository does not support the method."); } public void Save() { throw new NotImplementedException("This repository does not support the method."); } public bool IsUseDataFilter { get { return _isUseDataFilter; } set { _isUseDataFilter = value; this.Repository.IsUseDataFilter = value; } } }}<# if(!DoesFileExist(entity.Name + "Repository.cs")) { fileManager.StartNewFile(entity.Name + "Repository.cs"); #>using System;using System.Linq;using System.Collections.Generic; namespace <#= code.VsNamespaceSuggestion() #>{ <#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#>Repository { // Add your own data access methods. // This file should not get overridden }}<# } else { fileManager.StartNewFile(entity.Name + "Repository.cs"); this.Write(OutputFile(entity.Name + "Repository.cs")); }}fileManager.StartNewFile("IUnitOfWork.cs");#>using System.Data.Objects;namespace <#= code.VsNamespaceSuggestion() #>{ public interface IUnitOfWork { ObjectContext Context { get; set; } void Save(); bool LazyLoadingEnabled { get; set; } bool ProxyCreationEnabled { get; set; } string ConnectionString { get; set; } }}<# fileManager.StartNewFile("RepositoryIQueryableExtensions.cs");#>using System.Data.Objects;using System.Linq;namespace <#= code.VsNamespaceSuggestion() #>{ public static class RepositoryIQueryableExtensions { public static IQueryable<T> Include<T> (this IQueryable<T> source, string path) { var objectQuery = source as ObjectQuery<T>; if (objectQuery != null) { return objectQuery.Include(path); } return source; } }}<# fileManager.StartNewFile("EFRepository.cs");#>using System;using System.Collections.Generic;using System.Data.Objects;using System.Linq;using System.Text;using System.Linq.Dynamic;using System.Linq.Expressions;using SCM.SCMEntity;namespace <#= code.VsNamespaceSuggestion() #>{ public class EFRepository<T> : IRepository<T> where T : class { public IUnitOfWork UnitOfWork { get; set; } public bool IsUseDataFilter { get; set; } private IObjectSet<T> _objectset; private IObjectSet<T> ObjectSet { get { if (_objectset == null) { _objectset = UnitOfWork.Context.CreateObjectSet<T>(); } return _objectset; } } public virtual void Update(T entity) { UnitOfWork.Context.ApplyCurrentValues<T>(typeof(T).Name,entity); UnitOfWork.Save(); } public virtual IQueryable<T> All() { IQueryable<T> iq = ObjectSet.AsQueryable(); ; ApplyDataFilter(ref iq); return iq; } public IQueryable<T> Find(string where , params object[] paras) { IQueryable<T> iq =ObjectSet.Where(where , paras).AsQueryable(); ApplyDataFilter(ref iq); return iq; } public IQueryable<T> Find(Expression<Func<T, bool>> expression) { IQueryable<T> iq = ObjectSet.Where<T>(expression).AsQueryable(); ApplyDataFilter(ref iq); return iq; } public IQueryable<T> Sort(IQueryable<T> source,string sortfield) { return source.OrderBy(sortfield); } public void Add(T entity) { ObjectSet.AddObject(entity); } public void Delete(T entity) { ObjectSet.DeleteObject(entity); } public void Save() { UnitOfWork.Save(); } private void ApplyDataFilter(ref IQueryable<T> iq) { if (IsUseDataFilter==null||!IsUseDataFilter) return; var context = new SCM.SCMEntity.SCMEntity(); IObjectSet<sysDataFilter> _df = context.CreateObjectSet<sysDataFilter>(); if (System.Web.HttpContext.Current == null) return; if (System.Web.HttpContext.Current.Session["userid"] == null) return; string userid=System.Web.HttpContext.Current.Session["userid"].ToString(); List<sysDataFilter> dfs =_df.Where<sysDataFilter>(p=>p.UserID==userid&&p.TableID==typeof(T).Name).AsQueryable<sysDataFilter>().ToList();; var totalexp = iq.Expression; if (dfs == null) return; if (dfs.Count > 0) { var para = Expression.Parameter(typeof(T), "p"); foreach (sysDataFilter df in dfs) { var bin = Expression.Property(para, df.FieldName); Type t=bin.Type; #region Calculate expression switch (df.FOperator) { case "=": var con1 = Expression.Constant(df.FParameter,bin.Type); var bin1 = Expression.Equal(bin, con1); var ex1 = Expression.Lambda<Func<T, bool>>(bin1, para); try { switch(df.AndOr.ToLower()) { case "and": totalexp = Expression.And(bin1, totalexp); break; case "or": totalexp = Expression.Or(bin1,totalexp); break; default: totalexp=bin1; break; } }catch { totalexp = bin1;} break; case ">": var con2 = Expression.Constant(df.FParameter, bin.Type); var bin2 = Expression.GreaterThan(bin, con2); var ex2 = Expression.Lambda<Func<T, bool>>(bin2, para); try { switch (df.AndOr.ToLower()) { case "and": totalexp = Expression.And(bin2, totalexp); break; case "or": totalexp = Expression.Or(bin2, totalexp); break; default: totalexp = bin2; break; } }catch { totalexp = bin2;} //iq = iq.Where<T>(ex2).AsQueryable(); break; case "<": var con3 = Expression.Constant(df.FParameter, bin.Type); var bin3 = Expression.LessThan(bin, con3); var ex3 = Expression.Lambda<Func<T, bool>>(bin3, para); try{ switch (df.AndOr.ToLower()) { case "and": totalexp = Expression.And(bin3, totalexp); break; case "or": totalexp = Expression.Or(bin3, totalexp); break; default: totalexp = bin3; break; } }catch { totalexp = bin3;} //iq = iq.Where<T>(ex3).AsQueryable(); break; case "<>": var con6 = Expression.Constant(df.FParameter, bin.Type); var bin6 = Expression.LessThan(bin, con6); var ex6 = Expression.Lambda<Func<T, bool>>(bin6, para); try{ switch (df.AndOr.ToLower()) { case "and": totalexp = Expression.And(bin6, totalexp); break; case "or": totalexp = Expression.Or(bin6, totalexp); break; default: totalexp = bin6; break; } }catch { totalexp = bin6;} //iq = iq.Where<T>(ex6).AsQueryable(); break; case "StartWith": var con4 = Expression.Constant(df.FParameter); var bin4 = Expression.LessThan(bin, con4); var ex4 = Expression.Lambda<Func<T, bool>>(bin4, para); try{ switch (df.AndOr.ToLower()) { case "and": totalexp = Expression.And(bin4, totalexp); break; case "or": totalexp = Expression.Or(bin4, totalexp); break; default: totalexp = bin4; break; } }catch { totalexp = bin4;} //iq = iq.Where<T>(ex4).AsQueryable(); break; case "EndWith": var con5 = Expression.Constant(df.FParameter); var bin5 = Expression.LessThan(bin, con5); var ex5 = Expression.Lambda<Func<T, bool>>(bin5, para); try{ switch (df.AndOr.ToLower()) { case "and": totalexp = Expression.And(bin5, totalexp); break; case "or": totalexp = Expression.Or(bin5, totalexp); break; default: totalexp = bin5; break; } }catch { totalexp = bin5;} break; } #endregion } var exfinal = Expression.Lambda<Func<T, bool>>(totalexp, para); iq = iq.Where<T>(exfinal).AsQueryable(); } } }}<#fileManager.StartNewFile("EFUnitOfWork.cs");#>using System.Data.Objects;namespace <#= code.VsNamespaceSuggestion() #>{ public class EFUnitOfWork : IUnitOfWork { public ObjectContext Context { get; set; } public EFUnitOfWork() { Context = new <#=code.Escape(container)#>(); Context.CommandTimeout=1800; } public EFUnitOfWork(int count) { Context = new <#=code.Escape(container)#>(); Context.CommandTimeout = count; } public void Save() { Context.SaveChanges(); } public bool LazyLoadingEnabled { get { return Context.ContextOptions.LazyLoadingEnabled; } set { Context.ContextOptions.LazyLoadingEnabled = value;} } public bool ProxyCreationEnabled { get { return Context.ContextOptions.ProxyCreationEnabled; } set { Context.ContextOptions.ProxyCreationEnabled = value; } } public string ConnectionString { get { return Context.Connection.ConnectionString; } set { Context.Connection.ConnectionString = value; } } }}<# fileManager.Process();#><#+bool DoesFileExist(string filename){ return File.Exists(Path.Combine(GetCurrentDirectory(),filename)); }string OutputFile(string filename){ using(StreamReader sr = new StreamReader(Path.Combine(GetCurrentDirectory(),filename))) { string contents = sr.ReadToEnd(); return contents; }}string GetCurrentDirectory(){ string executingDirectoryName = ""; string stackTraceFileName = new StackTrace(true).GetFrame(0).GetFileName(); if (String.IsNullOrEmpty(stackTraceFileName)) { throw new ArgumentException("No value was specified for the ‘directoryName‘ configuration parameter" + ", and we could not figure out the file name from the stack trace (most likely because of running " + "the template with debug=‘False‘ specified in the <\u0023@ template \u0023> directive."); } else { executingDirectoryName = Path.GetDirectoryName(stackTraceFileName); } return executingDirectoryName;}string FindEDMXFileName(){ string edmxFile = ""; string[] entityFrameworkFiles = Directory.GetFiles(GetCurrentDirectory(), "*.edmx"); if(entityFrameworkFiles.Length > 0) edmxFile = entityFrameworkFiles[0]; return edmxFile;}#>
T4 模板代码示例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。