更新

1、根据实体对象更新

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

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

//如果需要获取数据库时间我们可以用  var dbTime = db.GetDate();

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


不更新 Name 和TestId

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


只更新 Name 和 CreateTime 

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


2、根据实体没有主键

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


3、 根据表达式更新

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

//只更新 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();

在原有字段实现+1更新

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


4、根据字典更新

//字典
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(dt);//转成字典就可以按上面的字典更新了


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