C#多表新增模板自动生成

首先我们了解一下多表新增的原理:
新增副表生成副表ID给到主表,在对主表进行新增。

分析参数:
参数为一个List对象,每一条数据对应一个表。
字段:表名(ef实体中对应的表名)(字符串),表别名(自定义)(字符串),表ID(字符串),需要其他表ID(字符串数组),该表中与其他表对应的字段(字符串数组)。

public class InsertVo
    {
        public string table_name { get; set; } //表名
        public string table_alias { get; set; } //别名
        public string table_id { get; set; } //表id
        public string[] alias_id_gather { get; set; }//其他表别名id集合   别名.id
        public string[] table_id_gather { get; set; }//当前表字段集合   别名.字段
}

分析流程:
1.生成方法名和参数
方法名采用insert开头接下来拼接表名中间用and连接。
参数采用(表名 表别名,xx xx,…)结构,可直接利用循环遍历List对象,进行生成。
2.生成新增代码和赋值代码。如a为新增代码,b为赋值代码
a) myModels.Add(表别名);myModels.SaveChanges();
b) 表1别名.字段 = 表2别名.id
遍历List对象,将需要其他表ID字段为空的表直接进行新增,取得表ID去重新遍历List对象,检索需要其他表ID数组中是否存在返回索引,若索引大于0表示存在,通过该索引获取到当前List对象中该表中与其他表对应的字段集合中的值,根据这两个值进行赋值代码生成,在对这两个数组进行缩容(移除数组元素),若无元素则赋值为空,最后剔除已经新增了的表。递归重新调用,直到List中无数据。
3.引入新增模板,更改上述两项完成生成。

代码实现:
1.新增代码模板

public ActionResult 头部
        {
            VO.ReturnJson returnJson = new VO.ReturnJson();
            //开启事物
            using (var scope = new System.Transactions.TransactionScope()) 
            {
                try
                {
                    代码块
                    //提交事物
                    scope.Complete();
                    returnJson.State = true;
                    returnJson.Msg = "添加成功!";
                }
                catch (Exception ex)
                {
                    returnJson.Msg = "服务器繁忙!错误代码:101";
                    //异常写入日志 默认路径:C盘的Log文件夹
                    Common.Tools.writeLogException(ex);  
                }
            }
            return Json(returnJson, JsonRequestBehavior.AllowGet);
        }

2.主方法

public ActionResult builderInsertBackstage(List<VO.InsertVo> insertVo)
{
 VO.ReturnJson returnJson = new VO.ReturnJson();
 if (System.IO.File.Exists(Server.MapPath("/code/insertCode.text"))) //读取新增模板
   {
       String insertCode = System.IO.File.ReadAllText(Server.MapPath("/code/insertCode.text"), Encoding.UTF8);
       string codestr = ""; //部分代码
       recursion(insertVo, ref codestr);
       string topStr = "insert"; //方法名
       for (int i = 0; i < insertVo.Count; i++)
       {
           if (i == insertVo.Count - 1)
           {
               topStr += insertVo[i].table_name;
           }
           else
           {
               topStr += insertVo[i].table_name + "and";
           }
       }
       string variables = "("; //变量
       for (int i = 0; i < insertVo.Count; i++)
       {
           if (i == insertVo.Count - 1)
           {
           variables += insertVo[i].table_name + " " + insertVo[i].table_alias + ")";
           }
           else
           {
           variables += insertVo[i].table_name + " " + insertVo[i].table_alias + ",";
           }
       }
       insertCode = Regex.Replace(insertCode, "头部", topStr + variables); //替换头部代码块(方法名和参数)
       insertCode = Regex.Replace(insertCode, "代码块", codestr); //替换代码块
       //页面返回值
       returnJson.State = true;
       returnJson.Msg = "生成成功!";
       returnJson.Object = insertCode;
   }
   else
   {
       returnJson.Msg = "找不到文件!";
   }
   return Json(returnJson, JsonRequestBehavior.AllowGet);
}

3.递归生成新增部分代码方法

public void recursion(List
<VO.InsertVo>insertVo, ref string str)
{
 for (int i = 0; i
    <insertVo.Count; i++)
  {
      if (insertVo[i].alias_id_gather == null)
       {
    str += "myModels." + insertVo[i].table_name + ".Add(" + insertVo[i].table_alias + ");";
           str += "myModels.SaveChanges();";
            for (int j = 0; j < insertVo.Count; j++)
             {
                 if (insertVo[j].alias_id_gather != null)
                 {
                     int index = Array.IndexOf(insertVo[j].alias_id_gather, insertVo[i].table_id);
                     if (index >= 0)
                     {
                         str += insertVo[j].table_id_gather[index] + " = " + insertVo[i].table_id + ";";
                         #region 移除数组元素
                         insertVo[j].alias_id_gather[index] = null;
                         insertVo[j].table_id_gather[index] = null;
                         if (insertVo[j].alias_id_gather.Length > 1)
                         {
                             string[] alias_id_gather = new string[insertVo[j].alias_id_gather[index].Length - 1];
                             string[] table_id_gather = new string[insertVo[j].table_id_gather[index].Length - 1];
                             for (int k = 0, c = 0; k
        <insertVo[j].alias_id_gather.Length; k++)
                             {
                                 if (insertVo[j].alias_id_gather[k] != null)
                                 {
                                     alias_id_gather[c] = insertVo[j].alias_id_gather[k];
                                     c++;
                                 }
                             }
                        for (int k = 0, c = 0; k < insertVo[j].table_id_gather.Length; k++)
                             {
                                 if (insertVo[j].table_id_gather[k] != null)
                                 {
                                     table_id_gather[c] = insertVo[j].table_id_gather[k];
                                     c++;
                                 }
                             }
                             insertVo[j].alias_id_gather = alias_id_gather;
                             insertVo[j].table_id_gather = table_id_gather;
                         }
                         else
                         {
                             insertVo[j].alias_id_gather = null;
                             insertVo[j].table_id_gather = null;
                         }
                         #endregion
                     }
                 }
             }
             insertVo.Remove(insertVo[i]);
             i--;
         }
     }
     if (insertVo.Count >0)
     {
         recursion(insertVo, ref str); //递归
     }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值