根据实体更新需要给实体配置主键,参考文档实体配置
//根据主键更新单条 参数 Class var result= db.Updateable(updateObj).ExecuteCommand(); //批量更新参数 List<Class> var result= db.Updateable(updateObjs).ExecuteCommand(); // 因没办法使用SqlFunc函数只能这么写 var dbTime = db.GetDate();
var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand()
var result=db.Updateable(updateObj).UpdateColumns(it => new { it.Name,it.CreateTime }).ExecuteCommand();
db.Updateable(insertObj).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();
用法同上唯一区别就是用WhereColumns指定条件
var result= db.Updateable(updateObj).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新单 条根据ID var result= db.Updateable(updateObjs).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新集合根据ID by id
根据表达式更新和上面的实体更新有着本质的区别,实体更新是要处理实体里面哪些字段要更新哪些不要更新
表达式则是需要更新什么写什,哪种方式都可以就看你喜欢哪一种
1、需要更新什么写什么
2、支持SqlFunc函数也支持字段相加比如 Num=it.Num+1
1、不支持批量更新不同记录,只支持批量更新统一的结果
2、没有实体更新节约代码
var result= db.Updateable<Student>() .SetColumns(it => new Student() { Name = "a", CreateTime = DateTime.Now }) .Where(it => it.Id == 11) .ExecuteCommand();
var result= db.Updateable<Student>() .SetColumns(it => it.Name == "jack") .Where(it => it.Id == 1) .ExecuteCommand(); //如果需要获取数据库时间我们可以用 SqlFunc.GetDate()
下面是简写实现功能一样
//只更新 name,createtime var result= db.Updateable<Student>(it =>new Student(){ Name = "a",CreateTime=DateTime.Now }).Where(it => it.Id == 11).ExecuteCommand(); //只更新 name 条件是 id=1 var result= db.Updateable<Student>(it => it.Name == "ack").Where(it => it.Id == 1).ExecuteCommand();
//实现在原有字段+1 var result= db.Updateable<Student>() .SetColumns(it => it.Num== it.Num+1) .Where(it => it.Id == 1) .ExecuteCommand();
var result71 = db.Updateable<Order>() .SetColumns(it => it.Name == "a") .SetColumnsIF(p!=null ,it => it.CreateTime == p.Value) .Where(it => it.Id == 11).ExecuteCommand();
//字典 var dt = new Dictionary<string, object>(); dt.Add("id", 1); dt.Add("name", null); dt.Add("createTime", DateTime.Now); var t66 = db.Updateable(dt).AS("student").WhereColumns("id").ExecuteCommand(); //字典集合 var dtList = new List<Dictionary<string, object>>(); dtList.Add(dt); dtList.Add(dt2); var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();
Dictionary<string,object> dc= db.Utilities.DataTableToDictionary(DataTable);//转成字典就可以按上面的字典更新了 var t666 = db.Updateable(dc).AS("student").WhereColumns("id").ExecuteCommand();
.ExecuteCommand换成.ExecuteCommandAsync
数据库必须自已能处理时间戳的变更,如果不能使用Datetime方式
SqlServer的时间戳类型是支持数据变更后自动变更的,其它数据库暂时不清楚
var data = new StudentVersion() { Id = db.Queryable<Student>().Select(it => it.Id).First(), Name = "", }; var time = db.Queryable<StudentVersion>().Where(it => it.Id == data.Id).Select(it => it.Timestamp).Single(); data.Timestamp = time; //当查出来的时间戳和更新时间戳一样 执行成功 db.Updateable(data).IsEnableUpdateVersionValidation().IgnoreColumns(it => new { it.Timestamp }).ExecuteCommand(); //更新完数据库会自动更新Timestamp,如果某种数据库不支持自动更新,请使用Datetime的方式 //在次更新同样的数据,就会报错因为 data.Timestamp与数据库不一样了 db.Updateable(data).IsEnableUpdateVersionValidation().IgnoreColumns(it => new { it.Timestamp }).ExecuteCommand();
实体结构
public int Id { get; set; } public string Name { get; set; } [SqlSugar.SugarColumn(IsEnableUpdateVersionValidation = true,IsOnlyIgnoreInsert=true)]//添加特性 public byte[] Timestamp { get; set; }
这种方式需要更新完后手动更新时间
var data = new StudentVersion2() { Id = db.Queryable<Student>().Select(it => it.Id).First(), CreateTime = DateTime.Now, Name = "", }; var time = db.Queryable<StudentVersion2>().Where(it => it.Id == data.Id).Select(it => it.CreateTime).Single(); data.UpdateTime = time; //和数据库一样执行成功 db.Updateable(data).IsEnableUpdateVersionValidation().ExecuteCommand(); data.UpdateTime = time.AddMilliseconds(-1);//不一样 //执行报错 db.Updateable(data).IsEnableUpdateVersionValidation().ExecuteCommand();
实体结构
public int Id { get; set; } public string Name { get; set; } //IsOnlyIgnoreInsert 根据需求可以加也可以不加 [SqlSugar.SugarColumn(IsEnableUpdateVersionValidation = true, IsOnlyIgnoreInsert = true)] public DateTime UpdateTime { get; set; }
2016 © donet5.comApache Licence 2.0