Пример #1
0
        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);
        }
Пример #2
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;
        }
Пример #3
0
        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;
        }