根据字典更新的时候应该如何指定版本验证字段
Closed this issue · 1 comments
JimmyTsai75 commented
按字典更新的时候如果解决并发更新锁的问题:
我有一个接口是这样的
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 的语句)
我的问题的,根据字典更新的时候应该如何指定版本验证字段?
JimmyTsai75 commented
解决了,发现是自己粗心,Update的时候没有给出T类型,正确的代码应该是:
db.Updateable(dic).AS(query.TableInfo.PrimaryTB).WhereColumns(idFieldName).ExecuteCommandWithOptLock();