void IEditableObject.CancelEdit() { CopyFrom(_bak, false); _bak = null; }
void IEditableObject.BeginEdit() { _bak = Clone() as EntityBase; }
private void SetValue(IEntity entity, String name, Type type, Object value) { // 注意:name并不一定是实体类的成员,随便读取原数据可能会造成不必要的麻烦 Object oldValue = null; if (type != null) { // 仅对精确匹配的字段进行读取旧值 oldValue = entity[name]; } //else //{ // type = value?.GetType(); // // 如果扩展数据里面有该字段也读取旧值 // if (entity.Extends.TryGetValue(name, out var v)) oldValue = v; //} // 不处理相同数据的赋值 if (Equals(value, oldValue)) { return; } if (type == typeof(String)) { // 不处理空字符串对空字符串的赋值 if (value != null && String.IsNullOrEmpty(value.ToString())) { if (oldValue == null || String.IsNullOrEmpty(oldValue.ToString())) { return; } } } else if (type == typeof(Boolean)) { // 处理字符串转为布尔型 if (value != null && value.GetType() == typeof(String)) { var vs = value.ToString(); if (String.IsNullOrEmpty(vs)) { value = false; } else { if (Array.IndexOf(TrueString, vs.ToLower()) >= 0) { value = true; } else if (Array.IndexOf(FalseString, vs.ToLower()) >= 0) { value = false; } else if (DAL.Debug) { DAL.WriteLog("无法把字符串{0}转为布尔型!", vs); } } } } else if (type == typeof(Guid)) { if (!(value is Guid)) { if (value is Byte[]) { value = new Guid((Byte[])value); } else if (value is String) { value = new Guid((String)value); } } } //// 不影响脏数据的状态 //var ds = entity.Dirtys; //Boolean? b = null; //if (ds.ContainsKey(name)) b = ds[name]; //entity[name] = value == DBNull.Value ? null : value; // 如果值类型不一致,则备份原始值到扩展,解决数据库类型比实体类型大(如Int64到Int32) if (value == DBNull.Value) { entity[name] = null; } else { entity[name] = value; if (value?.GetType() != type && !EntityBase.CheckEqual(entity[name], value)) { var ext = entity as IExtend3; ext[name] = value; } } //if (b != null) // ds[name] = b.Value; //else // ds.Remove(name); }
void IEditableObject.EndEdit() { //Update(); Save(); _bak = null; }