EF架構~為EF DbContext生成(cheng)的實體添加注(zhu)釋(shi)(T4模板應用)
相關文章系列
第八回 EF架構~將數據庫(ku)注釋添加(jia)導入到模型(xing)實體(ti)類中
第二十一回 EF架(jia)構(gou)~為EF DbContext生成的實體添加注釋(shi)(T4模板應用)
第二(er)(er)十二(er)(er)回 EF架構~為EF DbContext生(sheng)成的(de)實體添(tian)加注釋(shi)(T5模板(ban)應用(yong))
使(shi)用EF架構時(shi),你的(de)實體(ti)(ti)生(sheng)成方案(an)有(you)多(duo)種,entity object,poco,dbcontext等(deng)等(deng),對于entity object方案(an)生(sheng)成的(de)實體(ti)(ti),我們感(gan)覺很(hen)臃腫,當然它的(de)功能(neng)很(hen)強在,但有(you)時(shi)在查(cha)看類(lei)實體(ti)(ti)時(shi),有(you)些麻煩,因為所有(you)實體(ti)(ti)都在一個類(lei)文(wen)(wen)件中,有(you)點像linq to sql,而它的(de)類(lei)格局也與dbml有(you)些雷同,當然這不(bu)是(shi)今天(tian)的(de)重點,今天(tian)主要說的(de)是(shi)當EDMX文(wen)(wen)件添加注(zhu)釋后,如何把注(zhu)釋同時(shi)添加到dbcontext實體(ti)(ti)上。
方案:修改dbcontext的T4模版
實現:找到(dao)以下代碼塊
先為類加注釋
string summary=string.Empty; foreach (var entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) { fileManager.StartNewFile(entity.Name + ".cs"); BeginNamespace(namespaceName, code); if(entity.Documentation !=null && entity.Documentation.Summary!=null) summary=entity.Documentation.Summary; else summary=entity.Name; #> /// <summary> /// <#=summary#> /// </summary>
再為類中的(de)屬性加注釋
void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{}
將原來的代碼刪除,替(ti)換(huan)成如下代碼
void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty) { if (edmProperty.Documentation != null && edmProperty.Documentation.Summary != null) { WriteProperty(Accessibility.ForProperty(edmProperty), code.Escape(edmProperty.Documentation.Summary), code.Escape(edmProperty.TypeUsage), code.Escape(edmProperty), code.SpaceAfter(Accessibility.ForGetter(edmProperty)), code.SpaceAfter(Accessibility.ForSetter(edmProperty))); } else { WriteProperty(Accessibility.ForProperty(edmProperty), code.Escape(edmProperty.Name), code.Escape(edmProperty.TypeUsage), code.Escape(edmProperty), code.SpaceAfter(Accessibility.ForGetter(edmProperty)), code.SpaceAfter(Accessibility.ForSetter(edmProperty))); } } void WriteNavigationProperty(CodeGenerationTools code, NavigationProperty navigationProperty) { var endType = code.Escape(navigationProperty.ToEndMember.GetEntityType()); if (navigationProperty.Documentation != null && navigationProperty.Documentation.Summary != null) { WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)), code.Escape(navigationProperty.Documentation.Summary), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, code.Escape(navigationProperty), code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); } else { WriteProperty(PropertyVirtualModifier(Accessibility.ForProperty(navigationProperty)), code.Escape(navigationProperty.Name), navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, code.Escape(navigationProperty), code.SpaceAfter(Accessibility.ForGetter(navigationProperty)), code.SpaceAfter(Accessibility.ForSetter(navigationProperty))); } } void WriteProperty(string accessibility, string summary, string type, string name, string getterAccessibility, string setterAccessibility) { #> /// <summary> /// <#=summary#> /// </summary> <#=accessibility#> <#=type#> <#=name#> { <#=getterAccessibility#>get; <#=setterAccessibility#>set; } <#+ }
保存(cun)后(hou),它(ta)會將結果(guo)輸出到與TT文件(jian)同(tong)時的cs文件(jian)中,如果(guo)模板出現錯誤,也(ye)會將錯誤信(xin)息(xi)輸出到CS文件(jian)中,如果(guo)成功(gong),就會有如何內容:
1 //------------------------------------------------------------------------------ 2 // <auto-generated> 3 // This code was generated from a template. 4 // 5 // Manual changes to this file may cause unexpected behavior in your application. 6 // Manual changes to this file will be overwritten if the code is regenerated. 7 // </auto-generated> 8 //------------------------------------------------------------------------------ 9 10 using System; 11 using System.Collections.Generic;
而且,你的模(mo)型(xing)注釋信息會被同時添加到實體(ti)上,呵(he)呵(he)。