/// <summary>
        /// 
        /// </summary>
        /// <param name="values"></param>
        /// <returns></returns>
        protected override int ExecuteInsert(IDictionary values)
        {
            if (owner.SaveFunction == null)
                throw new DelegateNotFoundException("SaveFunction", "The insert function doesn't implemented.");

            var eventArg = new SavingEventArgs(owner.SourceType, values);
            owner.OnInserting(eventArg);

            if (eventArg.Cancel)
                return 0;

            var insertingActionEvent = new ActionEventArgs<SavingEventArgs, IPersisterResult>(eventArg, owner.SaveFunction);

            try
            {
                var result = insertingActionEvent.Execute();
                if (result.QueryException != null)
                {
                    owner.OnExecutionQueryError(new QueryResultEventArgs(result));
                    return -1;
                }

                owner.OnInserted(EventArgs.Empty);
                OnDataSourceViewChanged(EventArgs.Empty);
            }
            catch (Exception)
            {
                return -1;
            }
            return 1;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public IPersisterResult SaveFunction(SavingEventArgs parameter)
        {
            ITransactionProvider tr = customDAO.GetTransactionProvider();
            lock (customDAO)
            {
                try
                {
                    tr.BeginTransaction("SaveFunction", IsolationLevel.ReadCommitted);

                    var metadata = customDAO.GetPersistentClassInfo(parameter.SourceType);

                    var obj = Activator.CreateInstance(parameter.SourceType);
                    var dic = parameter.Values.Keys.Cast<object>().ToDictionary(current => current.ToString(), current => parameter.Values[current]);
                    metadata.SetPropertyValues(obj, dic, EntityMode.Poco);
                    customDAO.MakePersistent(obj);

                    tr.CommitTransaction();

                    return new PersisterResult(parameter.SourceType, 1);
                }
                catch (Exception ex)
                {
                    tr.RollbackTransaction(ex);
                    return new PersisterResult(parameter.SourceType, new ExecutionQueryException("Error on executing the saving function.", "SaveFunction", ex));
                }
            }
        }
 internal void OnInserting(SavingEventArgs e)
 {
     if (Inserting != null) Inserting(this, e);
 }