zoukankan      html  css  js  c++  java
  • Oracle,Mysql,SQlserver生成实体映射之SqlSugarT4

    官网:http://www.codeisbug.com

    代码已上传GitHub:https://github.com/SeaLee02/sealee

    本篇主要讲使用SqlSugar包进行Model生成,不会在乎具体到数据的什么类型映射成什么类型。

    环境:.net 4.6.1,Sqlsugar4

    问题:我们写代码跑是完全没有问题的,不管是什么数据库,都是可以的。如果我们使用的T4就会有问题,Mysql和Oracle会报错。解决办法,下面说到。

    ①安装我们的包,注意我的版本,然后生成,让bin文件生成我们的dll文件

    PS:T4模板里面的代码你可以在项目中写代码,调试好,然后把代码复制进去

    Sqlserver

    ② 创建T4文件 把下面的代码复制进去

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ import namespace="System.Collections.Generic" #>
    <#@ assembly name="$(SolutionDir)Sealee.UtilinDebugSealee.Util.dll" #>
    <#@ assembly name="System.Core" #>
    <#@ assembly name="System.Xml" #>
    <#@ assembly name="System.Xml.Linq" #>
    <#@ assembly name="System.Data" #>
    <#@ import namespace="System.Linq" #>
    <#@ import namespace="System.Text" #>
    <#@ import namespace="System.Collections.Generic" #>
    <#@ import namespace="SqlSugar" #>
    <#@ import namespace="Newtonsoft.Json" #>
    <#@ import namespace="System.IO" #>
    <#@ import namespace="System.Web" #>
    <#@ import namespace="Sealee.Util" #>
    <#@ assembly name="$(SolutionDir)SqlSugarDemoinDebugNewtonsoft.Json.dll" #>
    <#@ assembly name="$(SolutionDir)SqlSugarDemoinDebugSqlSugar.dll" #>
    <# 
         
        //CTRL+S将会执行该文件的代码,自动作生实体
    
        //当前项目目录
        string projectDir = Host.ResolveAssemblyReference("$(ProjectDir)");
    
        //解决方案目录
        string solutionDir = Host.ResolveAssemblyReference("$(SolutionDir)");
    
         var db = new SqlSugarClient(new ConnectionConfig() { 
                    ConnectionString =  @"server=PV-X00273458SQLEXPRESS;uid=sa;pwd=123;database=SchoolDB",
                    DbType = DbType.SqlServer, 
                    IsAutoCloseConnection = true,
                      InitKeyType = InitKeyType.Attribute});
    
    
              List<DbTableInfo> list = db.DbMaintenance.GetTableInfoList();
                        List<DbTableInfo> viewList = db.DbMaintenance.GetViewInfoList();
                        //
                        foreach (DbTableInfo table in list)
                        {
                            string table_name = table.Name.ToCase();
                            db.MappingTables.Add(table_name, table.Name);
                            List<DbColumnInfo> dd = db.DbMaintenance.GetColumnInfosByTableName(table.Name);
                            foreach (DbColumnInfo item in dd)
                            {
                                db.MappingColumns.Add(item.DbColumnName.ToCase(), item.DbColumnName, table_name);              
                            }
                db.DbFirst.IsCreateAttribute().Where(table.Name).CreateClassFile(projectDir+"\Model2","Modle");
                 }
                        //视图
                        foreach (DbTableInfo table in viewList)
                        {
                            string table_name = table.Name.ToCase();
                            db.MappingTables.Add(table_name, table.Name);
                            List<DbColumnInfo> dd = db.DbMaintenance.GetColumnInfosByTableName(table.Name);
                            foreach (DbColumnInfo item in dd)
                            {
                                db.MappingColumns.Add(item.DbColumnName.ToCase(), item.DbColumnName, table_name);     
                            }
               db.DbFirst.IsCreateAttribute().Where(table.Name).CreateClassFile(projectDir+"\Model2","Modle");
                 }
          //db.DbFirst.IsCreateAttribute().CreateClassFile(projectDir+"\Model","Modle");
    
         
    #>
    View Code

    注:我在头部引用了这个dll文件和命名空间,其实就是一个方法,用来处理我们的表明和字段的

    你也可以写在T4里面,然后进行调用(我是写在代码中的,这里就需要引用)

     /// <summary>
            /// 字符串处理  (_切分,首字母大写 (.)去除  )    ----》 扩展方法
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string ToCase(this string value)
            {
                if (string.IsNullOrEmpty(value))
                {
                    return string.Empty;
                }
                string[] arry = value.Split('_');
                string str = "";
                foreach (string item in arry)
                {
                    string newstr = item.Replace("(", "").Replace(".", "").Replace(")", "");
                    string firstLetter = newstr.Substring(0, 1);
                    string rest = newstr.Substring(1, newstr.Length - 1);
                    str += firstLetter.ToUpper() + rest.ToLower();
                }
                return str;
            }

    注意这里的连接,换成你的就可以了:

    ③右键运行自定义工具

    然后查看我们的项目,多了一个Model2文件夹,这个文件夹是不在我们的项目中的,你需要手动添加到我们的项目中

    对应的我们的数据库表:

    Mysql

    mysql的T4模板中我们只加了个dll和改变了连接方式其余的都没有变,然后就会提示我们dll没有引用,如果我们调试T4模板,他就会在new SqlSugarClient的时候出错

    Oracle

     Oracle的错误跟Mysql是一毛一样的。

    *我们的目录下一定是存在这个dll文件的。

     

    解决办法:

    https://github.com/sunkaixuan/SqlSugar  git上面下载他的源码

    他的这两个dll跟我们现在引用的不是同一个版本。

    打开项目,我们需要把SqlSuagr从新生成一下,然后进行引用试试

    ①改变框架,跟你现在创建的项目保持一致

     

     ②先删除他原来的这个两个dll引用,然后从我们的nuget上下载最新的,然后从新生成得到我们最新的SqlSugar.dll文件

     

    ③回到我们的项目,进行卸载sqlSugar,然后引用我们生成的sqlSugar.dll,然后从新生成

    ④打开我们的MysqlT4模板,运行

     

    然后并没有保存,再查看我们的项目,生成成功

     

    对于有些关键字还是会没有映射到,因为我们这里的名字和数据库的名字不一致,所以所有的字段必须映射,我们需要手动添加一下(看后面能不能把这个bug解决了)

    using System;
    using System.Linq;
    using System.Text;
    using SqlSugar;
    
    namespace ModleMysql
    {
        ///<summary>
        ///
        ///</summary>
        [SugarTable("datatestinfo2")]
        public partial class Datatestinfo2
        {
               public Datatestinfo2(){
    
    
               }
               /// <summary>
               /// Desc:
               /// Default:
               /// Nullable:False
               /// </summary>           
               [SugarColumn(ColumnName="PK")]
               public string Pk {get;set;}
    
               /// <summary>
               /// Desc:
               /// Default:
               /// Nullable:False
               /// </summary>           
               public string Text1 {get;set;}
    
               /// <summary>
               /// Desc:
               /// Default:
               /// Nullable:False
               /// </summary>           
               public bool Bool1 {get;set;}
    
               /// <summary>
               /// Desc:
               /// Default:
               /// Nullable:False
               /// </summary>           
               public bool Bool2 {get;set;}
    
        }
    }
    View Code

    ⑤运行我们的OracleT4模板(靠,我在公司跑就报错,在家跑就正常??) 

    ps:如果你重新引用了,还是报同样的错误,请把项目重启,如果还是报错,就执行调试T4模板进行跑项目(调试一定是不会报错的)

     

    值得一提:我们下载的Sqlsugar项目是可以进行修改的:根据你的需要进行修改,然后生成

  • 相关阅读:
    wabpack 多页面 react配置 (对比单页面)
    vue-router+nginx非根路径的配置方法
    Vue-Devtools快速安装配置教程
    C++字符串
    NSIS插件制作
    HOOK学习
    排序:数组置顶元素(将数组某个元素排到第一位)
    raect hook中使用防抖(debounce)和节流(throttle)
    浏览器的缓存机制
    JavaScript踩坑解构赋值
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/10236787.html
Copyright © 2011-2022 走看看