更新

1、根据实体对象更新

根据实体更新需要给实体配置主键,参考文档实体配置

//根据主键更新单条 参数 Class
var result= db.Updateable(updateObj).ExecuteCommand();


//批量更新参数 List<Class>
var result= db.Updateable(updateObjs).ExecuteCommand();

// 因没办法使用SqlFunc函数只能这么写
var dbTime = db.GetDate();

 1.1 不更新 Name 和TestId

var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand()

 1.2 只更新 Name 和 CreateTime 

var result=db.Updateable(updateObj).UpdateColumns(it => new { it.Name,it.CreateTime }).ExecuteCommand();

 1.3 只更新不为null的字段

db.Updateable(insertObj).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();

 1.4 特殊情况没有主键

 用法同上唯一区别就是用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


2、 根据表达式更新

根据表达式更新和上面的实体更新有着本质的区别,实体更新是要处理实体里面哪些字段要更新哪些不要更新

表达式则是需要更新什么写什,哪种方式都可以就看你喜欢哪一种

优点:

1、需要更新什么写什么

2、支持SqlFunc函数也支持字段相加比如 Num=it.Num+1

缺点:

1、不支持批量更新不同记录,只支持批量更新统一的结果 

2、没有实体更新节约代码


  2.1 更新 name,createtime 条件id=11

var result= db.Updateable<Student>()
.SetColumns(it => new Student() { Name = "a", CreateTime = DateTime.Now })
.Where(it => it.Id == 11)
.ExecuteCommand();

  2.2 只更新 name 条件id=1

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();

  2.3 在原有字段实现+1更新

//实现在原有字段+1
var result= db.Updateable<Student>()
.SetColumns(it => it.Num== it.Num+1)
.Where(it => it.Id == 1)
.ExecuteCommand();

 2.4 Set语法是支持多个的

var result71 = db.Updateable<Order>()
              .SetColumns(it => it.Name == "a")
              .SetColumnsIF(p!=null ,it => it.CreateTime == p.Value)
            .Where(it => it.Id == 11).ExecuteCommand();


3、根据字典更新

//字典
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();

 

4、根据DataTable更新

Dictionary<string,object> dc= db.Utilities.DataTableToDictionary(DataTable);//转成字典就可以按上面的字典更新了
var t666 = db.Updateable(dc).AS("student").WhereColumns("id").ExecuteCommand();


5、异步 

.ExecuteCommand换成.ExecuteCommandAsync



数据的版本控制

1、时间戳更新方式

数据库必须自已能处理时间戳的变更,如果不能使用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; }


2、DateTime方式

这种方式需要更新完后手动更新时间

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; }