码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-10-18 13:30:47      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

第一步:将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实体类中文注释和验证元数据)

标签:

原文地址:http://www.cnblogs.com/hlizard/p/5972639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!