将 增、删和改 变成一个API进行保存数据库,一般用于Winform等比较多
适合winform能用一个对象的操作
//通过跟踪实现 db.Tracking(getAll);//必须是个List getAll.RemoveAt(0);//删除记录 getAll.Last().Name = "a";//修改 getAll.Add(new xxx(){...});//添加 db.GridSave(getAll).ExecuteCommand();//删除+更新+插入
不是一个对象的可以指定对象实现
//1.删除不存在newList中的记录 //2.然后newList存在更新不存在删除 //不通过跟踪实现 db.GridSave(oldList, newList).ExecuteCommand(); //删除+更新+插入
比如list 1000条只要更新 1条那么跟踪方式性能肯定好,
如果list 1000条要更新300条那么肯定手动对比性能好
原理:跟踪没办法做到 update join 因为每条记录列的数量不同只能 update set a;update set b..一条一条更新
而非跟踪方式可以用Update Join 批量更新方式,对于大数据非跟踪方式性能会更好
支持导航更新所有二级导航, 自动只支持到二级导航 (更多层级看标题四)
//通过跟踪实现 db.Tracking(getAll); getAll.RemoveAt(0);//删除记录 getAll.Last().Name = "a";//修改 //没有导航也可以这样用 db.GridSave(getAll).IncludesAllFirstLayer().ExecuteCommand();//删除+更新+插入 //不使用跟踪 db.GridSave(getAll, getAll2).IncludesAllFirstLayer().ExecuteCommand(); //可以排除不要更新导航 db.GridSave(getAll, getAll2).IncludesAllFirstLayer("Items").ExecuteCommand();
拆分操作可以处理更复杂的业务
//拿出要删除的 var deleteObjs=db.GridSave(oldList, newList).GetDeleteList(); //执行导航删除 db.DeleteNav(ideleteObjs) .Include(z1 => z1.SchoolA).ThenInclude(z1 => z1.RoomList) .Include(z1 => z1.Books) .ExecuteCommand(); //执行导航更新+插入 db.UpdateNav(newList,new UpdateNavRootOptions() { IsInsertRoot = true }) .Include(z1 => z1.SchoolA).ThenInclude(z1 => z1.RoomList) .Include(z1 => z1.Books) .ExecuteCommand();
//拿出要删除的 var deleteObjs=db.GridSave(oldList, newList).GetDeleteList(); db.Deleteable(deleteObjs).PageSize(1000).ExecuteCommand();//高性能分页删除 db.Storageable(new Order()).PageSize(1000).ExecuteSqlBulkCopy()//大数据插入或者更新 //注意:BulkCopy底层是异步实现的如果winform中使用要当成异步方法使用不然会卡界面
很多情况下我们是不要删除操作的可以用下面功能
https://www.donet5.com/Home/Doc?typeId=2353
https://www.donet5.com/Home/Doc?typeId=1208
db.UpdateNav(newList,new UpdateNavRootOptions() { IsInsertRoot = true })//Option配置插入主表 .Include(z1 => z1.SchoolA).ThenInclude(z1 => z1.RoomList) .Include(z1 => z1.Books) .ExecuteCommand();
2016 © donet5.comApache Licence 2.0