protected override int ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) { Type type = CommonUtils.GetType(this.owner.TypeName); Check.Require(keys != null && keys.Count == 1, "Only single key field entity is supported."); IEnumerator en = keys.Keys.GetEnumerator(); en.MoveNext(); object entity = typeof(ReadOnlyActiveRecord<>).MakeGenericType(type).GetMethod("FindById", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static).Invoke(null, new object[] { keys[en.Current] }); NBearLiteDataSourceEventArgs saveArgs = new NBearLiteDataSourceEventArgs(entity, NBearLiteDataSourceSaveEventName.Update); if (entity == null) throw new System.Data.DBConcurrencyException("The underlying data doesn't exist, could not be updated."); bool changed = false; foreach (string key in values.Keys) { PropertyInfo property = ReflectionUtils.DeepGetProperty(type, key); if (this.owner.ConflictDetection == ConflictOptions.CompareAllValues) { if (property != null && (!CommonUtils.IsEqual(property.GetValue(entity, null), ChangeType(oldValues[key], property.PropertyType), true))) { throw new System.Data.DBConcurrencyException("The underlying data has changed."); } } if (object.Equals(values[key], oldValues[key])) continue; if (property != null && property.CanWrite) { changed = true; property.SetValue(entity, ChangeType(values[key], property.PropertyType), null); saveArgs.ModifiedFields.Add(key, new KeyValuePair<object,object>(oldValues[key], values[key])); } } if (changed) { owner.OnSaving(saveArgs); if (saveArgs.Cancelled) { return 0; } entity = saveArgs.Entity; if (entity == null) { return 0; } type.GetMethod("Update", Type.EmptyTypes).Invoke(entity, null); owner.OnSaved(saveArgs); this.OnDataSourceViewChanged(EventArgs.Empty); } return (changed ? 1 : 0); }
protected override int ExecuteDelete(IDictionary keys, IDictionary oldValues) { Type type = CommonUtils.GetType(this.owner.TypeName); Check.Require(keys != null && keys.Count == 1, "Only single key field entity is supported."); IEnumerator en = keys.Keys.GetEnumerator(); en.MoveNext(); object entity = typeof(ReadOnlyActiveRecord<>).MakeGenericType(type).GetMethod("FindById", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static).Invoke(null, new object[] { keys[en.Current] }); //check DBConcurrency if (this.owner.ConflictDetection == ConflictOptions.CompareAllValues) { if (entity == null) throw new System.Data.DBConcurrencyException("The underlying data doesn't exist, could not be deleted."); foreach (string key in oldValues.Keys) { PropertyInfo property = ReflectionUtils.DeepGetProperty(type, key); if (property != null && (!CommonUtils.IsEqual(property.GetValue(entity, null), ChangeType(oldValues[key], property.PropertyType), true))) { throw new System.Data.DBConcurrencyException("The underlying data has changed."); } } } NBearLiteDataSourceEventArgs deleteArgs = new NBearLiteDataSourceEventArgs(entity, NBearLiteDataSourceSaveEventName.Delete); owner.OnDeleting(deleteArgs); if (deleteArgs.Cancelled) { return 0; } entity = deleteArgs.Entity; if (entity == null) { return 0; } type.GetMethod("Delete", Type.EmptyTypes).Invoke(entity, null); owner.OnDeleted(deleteArgs); this.OnDataSourceViewChanged(EventArgs.Empty); return 1; }
protected override int ExecuteInsert(IDictionary values) { Type type = CommonUtils.GetType(this.owner.TypeName); object entity = Activator.CreateInstance(type); NBearLiteDataSourceEventArgs saveArgs = new NBearLiteDataSourceEventArgs(entity, NBearLiteDataSourceSaveEventName.Insert); foreach (string key in values.Keys) { PropertyInfo property = ReflectionUtils.DeepGetProperty(type, key); if (property != null) { property.SetValue(entity, ChangeType(values[key], property.PropertyType), null); saveArgs.ModifiedFields.Add(key, new KeyValuePair<object, object>(null, values[key])); } } owner.OnSaving(saveArgs); if (saveArgs.Cancelled) { return 0; } entity = saveArgs.Entity; if (entity == null) { return 0; } type.GetMethod("Create", Type.EmptyTypes).Invoke(entity, null); owner.OnSaved(saveArgs); this.OnDataSourceViewChanged(EventArgs.Empty); return 1; }