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

Posted hlizard

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从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_Batch

Dim   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实体类中文注释和验证元数据)的主要内容,如果未能解决你的问题,请参考以下文章

PowerDesigner怎样才能在修改表的字段Name的时候Code不自动跟着变

如何让PowerDesigner中的表显示中文

PowerDesigner运行自定义VBS脚本,复制Name到Comment

EF怎样只更新表的部分字段

如何用PowerDesigner 逆向工程导出数据库 表+字段+注释

PowerDesigner怎么找到英文的表名