/// <summary>处理更新的数据项</summary> /// <param name="remote"></param> protected virtual void ProcessItem(ISyncMasterEntity remote) { var local = Slave.FindByKey(remote.Key); // 本地不存在,新增; // 如果找到,但是同步时间为最小值,表示从未同步,那是新数据,碰巧主键与提供者的某条数据一致,可能性很小 if (local == null || local.LastSync <= DateTime.MinValue) { local = Convert(remote); local.LastUpdate = local.LastSync = DateTime.Now; local.Insert(); return; } // 本地没有修改,提供方覆盖本地;如果本地有修改,但是修改时间小于提供方,也由提供方覆盖 if (local.LastUpdate < local.LastSync || UpdateConflictByLastUpdate && local.LastUpdate < remote.LastUpdate) { CopyTo(remote, local); } // 本地有修改,本地覆盖提供方 else if (!Master.ReadOnly) { // 如果有返回值,可能是在更新的过程中数据有修改 var rs = Master.Update(Convert(local)); if (rs != null) { CopyTo(rs, local); } } local.LastSync = DateTime.Now; local.Update(); }
/// <summary>检查在指定时间后更新过的数据</summary> /// <param name="last"></param> /// <param name="start"></param> /// <param name="max"></param> /// <returns></returns> public virtual ISyncMasterEntity[] GetAllUpdated(DateTime last, Int32 start, Int32 max) { var name = LastUpdateName; var where = String.IsNullOrEmpty(name) ? null : Facotry.MakeCondition(LastUpdateName, last, ">"); var list = Facotry.FindAll(where, null, null, start, max); if (list == null || list.Count < 1) { return(null); } // 如果实体类实现了该接口,则返回 if (Facotry.Default is ISyncMasterEntity) { var rs = new ISyncMasterEntity[list.Count]; for (int i = 0; i < list.Count; i++) { rs[i] = list[i] as ISyncMasterEntity; } return(rs); } // 否则采用内置实现 else { var rs = new ISyncMasterEntity[list.Count]; for (int i = 0; i < list.Count; i++) { rs[i] = new SyncMasterEntity(this, list[i]); } return(rs); } }
ISyncSlaveEntity Convert(ISyncMasterEntity entity) { var rs = Slave.Create(); foreach (var item in Names) { rs[item] = entity[item]; } return(rs); }
///// <summary>删除冲突。默认将会</summary> //public event EventHandler<CancelEventArgs> DeleteConflict; #endregion #region 转换 ISyncMasterEntity[] Convert(ISyncSlaveEntity[] arr) { var rs = new ISyncMasterEntity[arr.Length]; for (Int32 i = 0; i < arr.Length; i++) { rs[i] = Convert(arr[i]); } return(rs); }
/// <summary>检查在指定时间后更新过的数据</summary> /// <param name="last"></param> /// <param name="start"></param> /// <param name="max"></param> /// <returns></returns> public virtual ISyncMasterEntity[] GetAllUpdated(DateTime last, Int32 start, Int32 max) { FieldItem fi = Facotry.Table.FindByName(LastUpdateName); //var where = fi == null ? null : fi > last; var where = new WhereExpression(); if (fi != null) { where &= fi > last; } var list = Facotry.FindAll(where, null, null, start, max); if (list == null || list.Count < 1) { return(null); } // 如果实体类实现了该接口,则返回 if (Facotry.Default is ISyncMasterEntity) { var rs = new ISyncMasterEntity[list.Count]; for (var i = 0; i < list.Count; i++) { rs[i] = list[i] as ISyncMasterEntity; } return(rs); } // 否则采用内置实现 else { var rs = new ISyncMasterEntity[list.Count]; for (var i = 0; i < list.Count; i++) { rs[i] = new SyncMasterEntity(this, list[i]); } return(rs); } }
/// <summary>更新数据</summary> /// <param name="entity"></param> /// <returns></returns> public virtual ISyncMasterEntity Update(ISyncMasterEntity entity) { if (entity == null) { return(null); } var e = entity as IEntity; if (e == null && entity is SyncMasterEntity) { e = (entity as SyncMasterEntity).Entity; } if (e == null) { return(null); } e.Update(); return(entity); }
ISyncSlaveEntity Convert(ISyncMasterEntity entity) { var rs = Slave.Create(); foreach (var item in Names) { rs[item] = entity[item]; } return rs; }
ISyncSlaveEntity[] Convert(ISyncMasterEntity[] arr) { var rs = new ISyncSlaveEntity[arr.Length]; for (int i = 0; i < arr.Length; i++) { rs[i] = Convert(arr[i]); } return rs; }
/// <summary>处理更新的数据项</summary> /// <param name="remote"></param> protected virtual void ProcessItem(ISyncMasterEntity remote) { var local = Slave.FindByKey(remote.Key); // 本地不存在,新增; // 如果找到,但是同步时间为最小值,表示从未同步,那是新数据,碰巧主键与提供者的某条数据一致,可能性很小 if (local == null || local.LastSync <= DateTime.MinValue) { local = Convert(remote); local.LastUpdate = local.LastSync = DateTime.Now; local.Insert(); return; } // 本地没有修改,提供方覆盖本地;如果本地有修改,但是修改时间小于提供方,也由提供方覆盖 if (local.LastUpdate < local.LastSync || UpdateConflictByLastUpdate && local.LastUpdate < remote.LastUpdate) { CopyTo(remote, local); } // 本地有修改,本地覆盖提供方 else if (!Master.ReadOnly) { // 如果有返回值,可能是在更新的过程中数据有修改 var rs = Master.Update(Convert(local)); if (rs != null) CopyTo(rs, local); } local.LastSync = DateTime.Now; local.Update(); }
/// <summary>更新数据</summary> /// <param name="entity"></param> /// <returns></returns> public virtual ISyncMasterEntity Update(ISyncMasterEntity entity) { if (entity == null) return null; var e = entity as IEntity; if (e == null && entity is SyncMasterEntity) e = (entity as SyncMasterEntity).Entity; if (e == null) return null; e.Update(); return entity; }
/// <summary>提交新增数据</summary> /// <param name="list"></param> /// <returns>返回新增成功后的数据,包括自增字段</returns> public virtual ISyncMasterEntity[] Insert(ISyncMasterEntity[] list) { if (list == null) return null; if (list.Length < 1) return new ISyncMasterEntity[0]; for (int i = 0; i < list.Length; i++) { var item = list[i]; if (item != null) { var entity = item as IEntity; if (entity == null && item is SyncMasterEntity) entity = (item as SyncMasterEntity).Entity; if (entity != null) entity.Insert(); else list[i] = null; } else list[i] = null; } return list; }
/// <summary>检查在指定时间后更新过的数据</summary> /// <param name="last"></param> /// <param name="start"></param> /// <param name="max"></param> /// <returns></returns> public virtual ISyncMasterEntity[] GetAllUpdated(DateTime last, Int32 start, Int32 max) { var name = LastUpdateName; var where = String.IsNullOrEmpty(name) ? null : Facotry.MakeCondition(LastUpdateName, last, ">"); var list = Facotry.FindAll(where, null, null, start, max); if (list == null || list.Count < 1) return null; // 如果实体类实现了该接口,则返回 if (Facotry.Default is ISyncMasterEntity) { var rs = new ISyncMasterEntity[list.Count]; for (int i = 0; i < list.Count; i++) { rs[i] = list[i] as ISyncMasterEntity; } return rs; } // 否则采用内置实现 else { var rs = new ISyncMasterEntity[list.Count]; for (int i = 0; i < list.Count; i++) { rs[i] = new SyncMasterEntity(this, list[i]); } return rs; } }