• 从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,
                "
    		/// <summary>
    		/// {0} - {1}
    		/// </summary>
    		",
                edmProperty.Documentation.Summary ?? "",
                edmProperty.Documentation.LongDescription ?? "");
    
                doc += string.Format(
                CultureInfo.InvariantCulture,
                "[Display(Name = "{0}")]
    		",
                edmProperty.Documentation.Summary.Replace('(', '_').Replace(')', '_').Replace('', '_').Replace('', '_').Replace(" ", "") ?? "",
                edmProperty.Documentation.LongDescription ?? "");
            }
    
            if (!edmProperty.Nullable)
            {
                doc += "[Required(ErrorMessage = "您需要填写{0}!")]
    		";
            }
    
            var maxLengthFacet = (Facet)edmProperty.TypeUsage.Facets.SingleOrDefault(f => f.Name == "MaxLength");
            if(maxLengthFacet != null && !maxLengthFacet.IsUnbounded)
            {
                doc += "[StringLength("+ maxLengthFacet.Value +", ErrorMessage = "{0}长度不能超过"+ maxLengthFacet.Value +"")]
    		";
            }
    
            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,
                "
    		/// <summary>
    		/// {0} - {1}
    		/// </summary>
    		",
                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

  • 相关阅读:
    《区块链100问》第56集:权益证明机制是什么?
    《区块链100问》第57集:股份授权证明机制是什么?
    《区块链100问》第58集:零知识证明是什么?
    《区块链100问》第59集:哈希算法是什么?
    《区块链100问》第60集:非对称加密算法是什么?
    《区块链100问》第61集:扩容是什么?
    《区块链100问》第62集:比特币为什么要扩容?
    《区块链100问》第63集:隔离见证是什么?
    使用Nginx后如何在web应用中获取用户ip及原理解释
    MySQL的进程状态
  • 原文地址:https://www.cnblogs.com/hlizard/p/5972639.html
Copyright © 2020-2023  润新知