首页 > 代码库 > 从PowerDesigner表字段的Name到EF实体类属性的Display Name(根据PowerDesigner生成EF实体类中文注释和验证元数据)

从PowerDesigner表字段的Name到EF实体类属性的Display Name(根据PowerDesigner生成EF实体类中文注释和验证元数据)

第一步:将PowerDesigner表字段的中文Name填入Comment中:工具-Execute Commands-Edit/Run Script...

技术分享
******************************************************************************* File:     name2comment.vbs* Title:    Name to Comment Conversion* Model:    Physical Data Model* Objects: Table, Column, View* Author:   steveguoshao* Created: 2013-11-29* Mod By:   * Modified: * Version: 1.0* Memo:     Modify from name2code.vbs******************************************************************************Option   Explicit ValidationMode   =   True InteractiveMode   =   im_BatchDim   mdl      the   current   model   get   the   current   active   model Set   mdl   =   ActiveModel If   (mdl   Is   Nothing)   Then   MsgBox   "There   is   no   current   Model " ElseIf   Not   mdl.IsKindOf(PdPDM.cls_Model)   Then   MsgBox   "The   current   model   is   not   an   Physical   Data   model. " Else   ProcessFolder   mdl End   If   This   routine   copy   name   into   comment   for   each   table,   each   column   and   each   view    of   the   current   folder Private   sub   ProcessFolder(folder)   Dim   Tab   running     table   for   each   Tab   in   folder.tables     if   not   tab.isShortcut   then       tab.comment   =   tab.name       Dim   col      running   column       for   each   col   in   tab.columns         col.comment=   col.name       next     end   if   next  Dim   view   running   view   for   each   view   in   folder.Views     if   not   view.isShortcut   then       view.comment   =   view.name     end   if   next     go   into   the   sub-packages   Dim   f      running   folder   For   Each   f   In   folder.Packages     if   not   f.IsShortcut   then       ProcessFolder   f     end   if   Next end   sub
name2comment.vbs

(可保存为文件以后直接打开执行)

 

第二步:从PowerDesigner表字段的Comment到SQL Server表字段的MS_Description(说明):数据库-Generate Database...

 

第三步:创建EF edmx文件

 

第四步:将SQL Server表字段的MS_Description(说明)添加到EF edmx文件:

EFTSQLDocumentation.Generator.exe -c "Data Source=.;Initial Catalog=xxxdb;User ID=sa;Password=yyy;" -i "上一步生成的edmx文件的完整路径"

然后刷新edmx(从数据库更新模型),可以多刷两遍。

(EFTSQLDocumentation.Generator.exe可到https://eftsqldocgenerator.codeplex.com/下载)

 

最后一步:修改生成实体类的T4模板(默认叫Model1.tt):

Model1.tt Namespace段:

public void BeginNamespace(CodeGenerationTools code){    var codeNamespace = code.VsNamespaceSuggestion();    if (!String.IsNullOrEmpty(codeNamespace))    {#>namespace Models{    using System.ComponentModel.DataAnnotations;<#+        PushIndent("    ");    }}public void EndNamespace(CodeGenerationTools code){    if (!String.IsNullOrEmpty(code.VsNamespaceSuggestion()))    {        PopIndent();#>}<#+    }}

 

技术分享
    public string Property(EdmProperty edmProperty)    {        string doc = "";        if (edmProperty.Documentation != null)        {            doc = string.Format(            CultureInfo.InvariantCulture,            "\n\t\t/// <summary>\n\t\t/// {0} - {1}\n\t\t/// </summary>\n\t\t",            edmProperty.Documentation.Summary ?? "",            edmProperty.Documentation.LongDescription ?? "");            doc += string.Format(            CultureInfo.InvariantCulture,            "[Display(Name = \"{0}\")]\n\t\t",            edmProperty.Documentation.Summary.Replace((, _).Replace(), _).Replace(, _).Replace(, _).Replace(" ", "") ?? "",            edmProperty.Documentation.LongDescription ?? "");        }        if (!edmProperty.Nullable)        {            doc += "[Required(ErrorMessage = \"您需要填写{0}!\")]\n\t\t";        }        var maxLengthFacet = (Facet)edmProperty.TypeUsage.Facets.SingleOrDefault(f => f.Name == "MaxLength");        if(maxLengthFacet != null && !maxLengthFacet.IsUnbounded)        {            doc += "[StringLength("+ maxLengthFacet.Value +", ErrorMessage = \"{0}长度不能超过"+ maxLengthFacet.Value +"\")]\n\t\t";        }        return doc + string.Format(            CultureInfo.InvariantCulture,            "{0} {1} {2} {{ {3}get; {4}set; }}",            Accessibility.ForProperty(edmProperty),            _typeMapper.GetTypeName(edmProperty.TypeUsage),            _code.Escape(edmProperty),            _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),            _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));    }    public string NavigationProperty(NavigationProperty navigationProperty)    {        var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType());        string doc = "";        if (navigationProperty.Documentation != null)        {            doc = string.Format(            CultureInfo.InvariantCulture,            "\n\t\t/// <summary>\n\t\t/// {0} - {1}\n\t\t/// </summary>\n\t\t",            navigationProperty.Documentation.Summary ?? "",            navigationProperty.Documentation.LongDescription ?? "");        }        return doc + string.Format(            CultureInfo.InvariantCulture,            "{0} {1} {2} {{ {3}get; {4}set; }}",            AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)),            navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,            _code.Escape(navigationProperty),            _code.SpaceAfter(Accessibility.ForGetter(navigationProperty)),            _code.SpaceAfter(Accessibility.ForSetter(navigationProperty)));    }
Model1.tt Property段

 

 

效果:

//------------------------------------------------------------------------------// <auto-generated>//    此代码是根据模板生成的。////    手动更改此文件可能会导致应用程序中发生异常行为。//    如果重新生成代码,则将覆盖对此文件的手动更改。// </auto-generated>//------------------------------------------------------------------------------namespace Models{    using System.ComponentModel.DataAnnotations;    using System;    using System.Collections.Generic;        public partial class Custom    {                /// <summary>        /// 客户ID -         /// </summary>        [Display(Name = "客户ID")]        [Required(ErrorMessage = "您需要填写{0}!")]        public int CustomID { get; set; }                /// <summary>        /// 客户名称 -         /// </summary>        [Display(Name = "客户名称")]        [Required(ErrorMessage = "您需要填写{0}!")]        [StringLength(60, ErrorMessage = "{0}长度不能超过60")]        public string CustomName { get; set; }        

 

 

参考:

http://www.iteye.com/topic/1138201

http://www.cnblogs.com/hhhh2010/p/5344256.html

http://stackoverflow.com/questions/13931159/add-documentation-to-generated-code-in-entity-framework-model-first

https://eftsqldocgenerator.codeplex.com/

Entity Framework Power Tools:https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d/

 

谢谢小伙伴wwl、jxt

 

从PowerDesigner表字段的Name到EF实体类属性的Display Name(根据PowerDesigner生成EF实体类中文注释和验证元数据)