DotNetNext/SqlSugar

根据字典更新的时候应该如何指定版本验证字段

Closed this issue · 1 comments

按字典更新的时候如果解决并发更新锁的问题:
我有一个接口是这样的

public interface IDatabaseModel
{   
    public int Id { get; set; }       
    /// <summary>
    /// 修改标识
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public bool Modifyed { get; set; }
    /// <summary>
    /// 冲突标识
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public bool Conflict { get; set; }
    /// <summary>
    /// 新数据标识
    /// </summary>
    [SugarColumn(IsIgnore = true)]        
    public bool Is_New { get; set; }
    /// <summary>
    /// 删除标识
    /// </summary>
    [SugarColumn(ColumnName = "Deleted")]
    public bool Deleted { get; set; }
    /// <summary>
    /// 当前数据版本
    /// </summary>
   [SugarColumn(ColumnName = "Guid", IsEnableUpdateVersionValidation = true, DefaultValue = "1", ColumnDescription = "当前数据版本")]
    public string? Guid { get; set; }
    /// <summary>
    /// 是否被选定
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public bool IsSelected { get; set; }
}

我执行更新的时候是这样的代码:

db.Updateable<T>(item).ExecuteCommandWithOptLock(true);

这样是没有问题的,现在的问题是,我有一个View的更新,我需要采用字典更新的办法来解决有的字段要更新有的字段不更新,所以我采用了这样的代码:

//dic 计算出需要更新的字段
Dictionary<string, object> dic = Global.GetUpdateDic(item, idFieldName, query.PrimaryTBType);
// 根据字典更新
db.Updateable(dic).AS(query.TableInfo.PrimaryTB).WhereColumns(idFieldName).ExecuteCommandWithOptLock();

结果就会出错,错误是:Dictionary2 need IsEnableUpdateVersionValidation=true

我明白这个是因为字典更新的时候没有办法知道哪一个是IsEnableUpdateVersionValidation字段,如果我改成了这样:

db.Updateable(dic).AS(query.TableInfo.PrimaryTB).WhereColumns(idFieldName).ExecuteCommand()

是可以的,但是它不能解决我版本冲突的问题,它在更新的时候并没有判断Guid字段和旧数据是否一致(Where里面没有WHERE [Guid] = @guid0 的语句)

我的问题的,根据字典更新的时候应该如何指定版本验证字段?

解决了,发现是自己粗心,Update的时候没有给出T类型,正确的代码应该是:

db.Updateable(dic).AS(query.TableInfo.PrimaryTB).WhereColumns(idFieldName).ExecuteCommandWithOptLock();