从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

时间: 2024-10-13 20:25:34

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

项目中 2个或者多个EF模型 表名称相同会导致生成的实体类 覆盖的解决方法

场景:  2个数据库, 一个新,一个旧,  把旧的 数据库中的数据,导入到新的数据库中,  使用到了2个 EF实体模型, 新数据库 和 旧数据库中的表,有的名称是相同的 (但是结构是不同的) 旧的数据库中的 tb_area 表,只有2个字段 新数据库中的 tb_area 有很多字段  ,结果新数据库里面的 表,由于和旧数据库的表 重名,导致旧数据库里面的  表生产的cs文件 没有了, 只剩下新数据库中的表实体   那么现在问题就来了,我要调用旧表里面的 model 实体模型,怎么拿呢? 拿不到了

【转】PowerDesigner物理数据表生成C#实体类Model

model实体类是什么: 在三层架构UI,BLL,DAL中,有时用户插入一条记录到数据库中,必然会有不少数据,按正常编程,也必然会一下子调用某个函数传入不少参数.为了减少参数的数量,达到高效简洁的效果,一般会用model实体类作为传输数据的载体. model实体类一般对应着数据库里的字段,一个类实体对应一张表.比如:user数据表 有id,password,name,那么实体类usr也相应id,password,name属性来作为数据载体.但是有时我们在PowerDesigner设计的数据库表太

EF Power Tools的Reverse Engineer Code First逆向生成Model时处理计算字段

VS2013上使用EF Power Tools的Reverse Engineer Code First逆向生成Model时,没有处理计算字段.在保存实体时会出现错误. 可以通过修改Mapping.tt解决. 打开Mapping.tt,找到 foreach (var prop in efHost.EntityType.Properties) { var type = (PrimitiveType)prop.TypeUsage.EdmType; var isKey = efHost.EntityTy

salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解

建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema Builder查看表结构以及多表之间的关联关系,可以登录后点击setup在左侧搜索框输入schema Builder 或者build-->schema Builder进入: 2.采用force.com Explorer通过自己写查询语句来查询数据. 此链接为force.com Explorer的下载链接:  http://force-com-explorer-beta.software.infor

一步一步学EF系列【2、Fluent API的方式来处理实体与数据表之间的映射关系。】

EF里面的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面,还有一个就是Fluent API,通过新增相应的配置类来覆盖默认配置另外.我们主要学习Fluent API,Data Annotations可以自行去学习一下. 补充一下为什么要用Fluent API 使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入Ent

【原创】文本工具的使用--根据数据库字段快速生成该表对应的Model类属性

在实际项目开发过程中,我们会经常碰到这样的问题:数据库表的字段按下划线命名方式都设计好了,接下来是要创建该表对应的Model类.如果我们按照数据库表中的字段,再手动敲一遍,生成对应Model类的属性.在字段少的情况下,手动创建Model类似乎没啥的.要是字段比较多,那就有点费时了.那如何快速生成数据库表字段对应的Model类呢?以下是本人的解决方案: 1.将建表语句复制到文本编辑器,如notepad++,editplus,vim等. 2.剔除其他字符串,提取字段 点击全部替换 3.下划线法转驼峰

让你提前认识软件开发(36):如何扩展数据表字段?

第2部分 数据库SQL语言 如何扩展数据表字段? [文章摘要] 在通信类软件中,经常会与数据库打交道.由于需求变化,或者是程序优化升级等原因,对数据表字段进行扩展是常有的事情.这就要求开发人员必须熟练掌握对数据表字段进行扩展的操作流程. 本文基于作者的数据库方面的工作经验,以实际的SQL程序为例,详细介绍了如何对对数据表字段进行扩展,为相关的开发工作提供了参考. [关键词] 数据库  数据表  扩展  SQL  开发 一.前言 在实际的软件开发项目中,对数据表字段的扩展包括如下两个方面: 第一,

asp创建表,复制表 字段类型附录

asp创建表,复制表 字段类型附录 在已有数据库中创建表  <% set conn=server.CreateObject("adodb.connection")  sql="provider=microsoft.jet.oledb.4.0;data source="&server.MapPath("BOOK.mdb")  conn.open sql  Conn.Execute("create table bbb(id A

KO ------- 表中字段名和实体类属性名不一致

-----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就会为空 (一)问题复现 1.先创建数据库 mybatis_db, 再创建表 t_user,并插入若干数据 注意:user_id 为主键,且为自动增长 2.创建实体类 User.java: package com.siwuxie095.entity; // 实体类 public class User