首先我们了解一下多表新增的原理:
新增副表生成副表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); //递归
}
}