• 我的ORM之九 -- 生成器


    我的ORM索引

    数据库连接字符串格式

    <add name="dbo" connectionString="" providerName="MySql.5" />

    生成数据库实体,要求数据库完整定义到一个库中。 在App.config 中配置为 dbo 项。

    providerName中分为两部分:数据库和版本号。

    数据库定义枚举:

    public enum DatabaseEnum
    {
        /// <summary>
        /// 指 SqlServer 2005,2008
        /// </summary>
        SqlServer = 1,
        Excel,
        MsAccess,
        Oracle,
        MySql,
        Sqlite,
        PostgreSql,
        DB2,
        Other,
    }

    目前并不是全部支持。仅支持: Sqlserver 2005+,MySql5+

    配置文件

    MyOql生成器需要一个配置文件,形如:

    <MyOqlCodeGen>
      <Table db="dbo" Owner="dbo">
        <Group Name="PlatForm">
          <Entity Name="P_CarBrand" Enums="" PKs="ID" AutoIncreKey="ID" FKs="(Logo)()=S_SysAnnex:(ID)" />
          <Entity Name="P_CarFactory" Enums="" PKs="ID" AutoIncreKey="ID" FKs="(BrandID)()=P_CarBrand:(ID)" />
          <Entity Name="P_CarType" Enums="Level=CarLevelEnum" PKs="ID" AutoIncreKey="ID" FKs="(BrandID)()=P_CarBrand:(ID);(FactoryID)()=P_CarFactory:(ID)" />
          <Entity Name="P_CarInfo" Enums="Status=CarMarketStatusEnum;Source=CarSourceEnum" PKs="ID" AutoIncreKey="ID" FKs="(TypeID)()=P_CarType:(ID)" />
        </Group>
      </Table>
      <View db="dbo" Owner="dbo">
        <Group Name="View">
          <Entity Name="VTxtRes" Enums="Lang=LangEnum" PKs="Lang,ResID" MyTable="S_ResKey,S_ResValue" />
        </Group>
      </View>
      <Proc Owner="dbo" db="dbo">
        <Group Name="">
          <Entity Name="P_Login" Return="result=PUserRule.Entity:out" MyTable="P_LoginUser" />
        </Group>
      </Proc>
      <Function Owner="dbo" db="dbo">
        <Group>
          <Entity Name="Split" TypeMap="Value=String" Paras="val=String:in,split=String:in" />
        </Group>
      </Function>
    </MyOqlCodeGen>

    对于复杂项目,手写这个Xml非常麻烦。我写了一个工具,使用 MyTool 我们就不需要操作这个大文件了。

    http://code.taobao.org/svn/MyMvcApp/MyTool/

    该项目的配置文件被分解在 MyOqlCodeGen 文件夹中

    MyTool生成实体

    命令行:生成实体代码.bat

    @echo off
    setlocal
    set curDisk=%~d0
    set curPath=%~dp0
    
    %curDisk%
    cd %curPath%
    
    call MyOqlCodeGen合并MyOqlCodeGen.bat
    bindebugMyTool -CodeGen -ToPath "..DbEntEntity" -Log "R:CodeGen.log" -Namespace DbEnt -CodeHeader MyOqlCodeGenCodeHeader.txt -ReadmeFile MyOqlCodeGenReadMe.txt
    
    notepad "R:CodeGen.log"
    endlocal
    rem call 语音完成.js
    pause;

    配置文件结构

    代码生成器的配置文件结构分为四部分:

    1. Txt文件,它是静态文件,可以看做常量,不必修改。

    2. Init文件,初始化文件,是可以通过程序或脚从数据库中自动生成的。

    3. Config文件,我们需要手动修改的配置。重点。

    4. Xml文件,是临时生成的文件,不必签入到SVN。

    在Init文件和 Config文件类型中,分别有四个类型:

    1. Table

    2. View

    3. Procedure

    4. Function (表值函数)

    数据库

    生成器是基于 Sqlserver2008+进行的。

    1. 向 Sqlserver2008+中注入程序集 MyClr: 运行 MyOqlMyClr注册程序集.sql ,需要修改一下 MyClr.dll 程序集的地址。

    2. 创建生成实体的存储过程: 运行 MyOqlMyClr创建Dev_Ent.sql 

    完成。

    在Sqlserver中执行: 

    1. Dev_Ent 生成 MyOqlCodeGen_Auto_Table.init 内容。

    2. Dev_Function 生成  MyOqlCodeGen_Auto_Func.init 内容。

    3. Dev_Proc 生成 MyOqlCodeGen_Auto_Proc.init 内容。

    4. Dev_CheckFk 用来检查数据规范,1 是所有自增表生成添加ID为0的SQL。ID为0的记录表示空。 2是生成外键不为空的SQL。

    5. View的自动生成器没有写。

    操作步骤

    1. 设置表

    2. 设置MyTool的App.config 中 dbo的 数据库连接字符串

    3. 在DbEnt项目的 EntEnum文件夹中建立表的枚举。(每个表一个文件。)

    4. 数据库中执行: Dev_Ent -》 MyOqlCodeGen_Auto_Table.init

    5. 数据库中执行: Dev_Function -》 MyOqlCodeGen_Auto_Func.init

    6. 数据库中执行: Dev_Proc -》 MyOqlCodeGen_Auto_Proc.init

    7. 手写 MyOqlCodeGen_Auto_View.init

    8. 编辑 MyOqlCodeGen_My_Table.config 

    9. 编辑 MyOqlCodeGen_My_Func.config

    9. 编辑 MyOqlCodeGen_My_Proc.config

    10. 编辑 MyOqlCodeGen_My_View.config

    11. 执行 生成实体代码.bat

    编辑格式

    所有对象都可以分组,这也是MyOql的一个重要思想。组名可以为空,空组的实体,会附加到 dbr 对象上。

    表对象的配置的内容有:数据组,枚举项,BitSummarys,IdName,db,Owner 。

    枚举项配置格式:  列名=枚举;列名2=枚举2;...

    BitSummarys格式: 列名=是,否;列名2=启用;禁用;...

    IdName 表示该实体的名称列,默认为Name,如果不是Name,则需要指定,代码生成器将生成  Get{实体名称}By{ID键} 的方法, 格式: 列=名称

    db指定连接的数据库, 对于代码生成器来说,应该都在同一个数据库上进行设计,所以这个可统一使用 dbo

    Owner表示所有者,即表名的前缀,一般来说只有一个数据方案,即 dbo (对MySql来说,该值无效)

    运行环境

    生成实体之后,需要把生成的实体部署到Web环境中,过程:

    1. 在 DbEnt 中添加生成的实体文件(可能需要显示隐藏文件)

    2. 项目需要的Dll: MyCmn.dll , MyJson.dll, FastReflectionLib.dll , MyOql.EventConfig.dll , (MyOql.MySql.dll,MySql.Data.dll) ,这些Dll 都在 MyOqllib4 下面。

    3. Web项目,添加 web.config:

    <configuration>
      <configSections>
        <section name="MyOql" type="MyOql.MyOqlConfigSect,MyOql" />
      </configSections>
      <MyOql configSource="MyOql.config" />
      <connectionStrings>
        <add name="dbo" connectionString="Server=192.168.16.23;Database=CvApp_Db;Uid=root;Pwd=1234;" providerName="MySql.5" />
      </connectionStrings>
    </configuration>

    MyOql.config文件内容:

    <?xml version="1.0"?>
    
    <MyOql>
      <Entitys db="dbo"  CacheType="Local" CacheTime="0" CacheSqlTime="0" MaxCacheTime="43200" OraclePKG="PKG" Owner="dbo" >
        <Group Name="主库">
        </Group>
        <Group  Name="本地缓存"  CacheSqlTime="3600" CacheTime="3600" >
          <Entity Name="S_Menu"     UsePower="="  />
        </Group>
      </Entitys>
      <DbProviders>
        <Provider Name="SqlServer" Type="MyOql.Provider.SqlServer,MyOql"/>
        <Provider Name="MySql" Type="MyOql.Provider.MySql_Translater,MyOql.MySql"/>
        <Provider Name="Oracle" Type="MyOql.Provider.Oracle,MyOql.OracleProvider"/>
      </DbProviders>
    </MyOql>

    Global.asax:

            protected void Application_Start()
            {
                dbo.Event = MyOqlEvent.GetInstance();
            }
  • 相关阅读:
    不指定虚拟路径的前提下通过http访问pdf、图片等文件
    Java Service Wrapper将java程序设置为服务
    C# 上传excel文档解析出里面数据
    如何同时启动多个Tomcat服务
    struts2的action的知识点和利用action向页面注入值的操作
    IOS6 字体高亮显示
    微软安全新闻聚焦-双周刊第三十五期
    工厂三兄弟之工厂方法模式(四)
    清空文件夹里面的所有文件和文件夹
    OOP设计模式[JAVA]——03职责链模式
  • 原文地址:https://www.cnblogs.com/newsea/p/4530828.html
Copyright © 2020-2023  润新知