数据库如图
怎么在插入一个TestReport的时候将其他表相关的数据一起插入,这个存储过程怎么写。
包括触发器什么的。
需要整个存储过程写法
直接使用实体模型插入一个report对象,好慢。有好方法吗
你这样测试的不是很准确,测试时间开销 Stopwatch
Stopwatch sw = new Stopwatch(); sw.Start(); //开始计时 db.TestReport.Add(testReport); db.SaveChanges(); Console.WriteLine("4"); //这条语句要放到计时结束,打印输出是耗时的 sw.Stop(); //计时结束
额···我想知道的是如何改进
@GhostRider_zkc: 你这样测试一条数据,也是要创建一个Connection连接对象的,创建Connection对象是比较耗时的,不然也不会默认开启连接池的,你要插入的比较快的话,可以通过ef直接使用sql语句的方式来执行,用StringBuilder来拼接多条语句,拼接好一块执行,这样速度比快
你如果用存储过程插入会很麻烦,得传多少参数啊,如果用ado.net整体插入太慢可一个表一个表的插入从主表开始
从主表开始,每次插入一个数据记录,然后获得他的ID给下一个表用?
这样也挺麻烦哦
@GhostRider_zkc: 你是用的EF吗?还是ADO.NET, 看你的图应该不是用的ADO.NET,因为ADO.NET没有实体对象概念
@Zery: 用EF,但是我一个Report对象里面的Result就几千条,插入速度好慢啊
@GhostRider_zkc:
用EF就好处理了,换种方法实现试
using(var dbContext = new Enttity())
{
dbContext.table1.AddObject(Report.table1);
dbContext.table2.AddObject(Report.table2);
dbContext.table3.AddObject(Report.table3);
dbcontext.SaveChange()
}
一个个表插入再整体保存
@Zery: 你这table1,table2指的是?我一个Report有几个Unit,每个Unit有几个Diagram,每个Diagram会有几千个Result。
@GhostRider_zkc: 你的Report对象是不是可以通过导航属性把其子表的数据加载出来?
如果是那写法就是Report.TestUnit.Diagraminfo.TestResult
dbContext.TestUnit.AddObject(Report.TestUnit);
dbContext.Diagraminfo.AddObject(Report.TestUnit.Diagraminfo);
dbContext.TestResult.AddObject(Report.TestUnit.Diagraminfo.TestResult);
@Zery: 一层层添加后在SaveChange()?我试试
@Zery: 还是一样,速度没变化
@GhostRider_zkc: 贴你插入的关键代码出来
@Zery:
@GhostRider_zkc:
这种写法太耗时了,三层循环EF本身没有批量增加的方法 所以你这里还是要循环添加到上下文中,但是不用嵌套
可以把对象分别取出 如
var testUnitList = testReport.TestUnit.ToList();
foreach(var item in testUnitList)
{
db.TestUnit.Add(item)
}
接下来的几个对象同样处理
@Zery: 不嵌套怎么取出DiagramInfo呢
@GhostRider_zkc: testReport.TestUnit.DiagramInfo.Tolist();
@Zery: 一个Report有几个Unit,这样不知道是哪个Unit的,点不出DiagramInfo
@GhostRider_zkc: 不管几个Unit不都是要存DB的吗,把Unit下的Diagraminfo加载到一个集合中然后去存db,我的思路是把纵向的数据变为横向的数据后再存储,有点用空间换时间的感觉