EF架构~为EF DbContext生成的实体添加注释(T4模板应用)

简介:

相关文章系列

第八回  EF架构~将数据库注释添加导入到模型实体类中

第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用)

第二十二回  EF架构~为EF DbContext生成的实体添加注释(T5模板应用

使用EF架构时,你的实体生成方案有多种,entity object,poco,dbcontext等等,对于entity object方案生成的实体,我们感觉很臃肿,当然它的功能很强在,但有时在查看类实体时,有些麻烦,因为所有实体都在一个类文件中,有点像linq to sql,而它的类格局也与dbml有些雷同,当然这不是今天的重点,今天主要说的是当EDMX文件添加注释后,如何把注释同时添加到dbcontext实体上。

方案:修改dbcontext的T4模版

实现:找到以下代码块

先为类加注释

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>

再为类中的属性加注释

void WriteProperty(CodeGenerationTools code, EdmProperty edmProperty)
{}

将原来的代码删除,替换成如下代码

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; }
<#+
}

保存后,它会将结果输出到与TT文件同时的cs文件中,如果模板出现错误,也会将错误信息输出到CS文件中,如果成功,就会有如何内容:

 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;

而且,你的模型注释信息会被同时添加到实体上,呵呵。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~为EF DbContext生成的实体添加注释(T4模板应用),如需转载请自行联系原博主。

目录
相关文章
|
2月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
17天前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
51 26
|
28天前
|
容灾 网络协议 数据库
云卓越架构:云上网络稳定性建设和应用稳定性治理最佳实践
本文介绍了云上网络稳定性体系建设的关键内容,包括面向失败的架构设计、可观测性与应急恢复、客户案例及阿里巴巴的核心电商架构演进。首先强调了网络稳定性的挑战及其应对策略,如责任共担模型和冗余设计。接着详细探讨了多可用区部署、弹性架构规划及跨地域容灾设计的最佳实践,特别是阿里云的产品和技术如何助力实现高可用性和快速故障恢复。最后通过具体案例展示了秒级故障转移的效果,以及同城多活架构下的实际应用。这些措施共同确保了业务在面对网络故障时的持续稳定运行。
|
3月前
|
Cloud Native 安全 持续交付
深入理解微服务架构及其在现代软件开发中的应用
深入理解微服务架构及其在现代软件开发中的应用
101 32
|
3月前
|
存储 监控 API
深入解析微服务架构及其在现代应用中的实践
深入解析微服务架构及其在现代应用中的实践
90 12
|
3月前
|
监控 持续交付 API
深入理解微服务架构及其在现代应用开发中的应用
深入理解微服务架构及其在现代应用开发中的应用
43 4
|
3月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
89 1
|
3月前
|
监控 持续交付 API
深入理解微服务架构及其在现代软件开发中的应用
深入理解微服务架构及其在现代软件开发中的应用
68 3
|
3月前
|
边缘计算 监控 自动驾驶
揭秘云计算中的边缘计算:架构、优势及应用场景
揭秘云计算中的边缘计算:架构、优势及应用场景
|
3月前
|
监控 物联网 持续交付
深入理解微服务架构及其在现代软件开发中的应用
深入理解微服务架构及其在现代软件开发中的应用
49 0

热门文章

最新文章