/// <summary>
        /// 
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public IPersisterResult UpdateFunction(UpdatingEventArgs parameter)
        {
            lock (customDAO)
            {
                object objectToUpdate = customDAO.FindBy(parameter.SourceType, parameter.Key, LockMode.Upgrade);
                Dictionary<string, object> dic = parameter.Values.Keys.Cast<object>().ToDictionary(current => current.ToString(), current => parameter.Values[current]);

                ITransactionProvider tr = customDAO.GetTransactionProvider();

                try
                {
                    tr.BeginTransaction("UpdateFunction", IsolationLevel.ReadCommitted);

                    var metadata = customDAO.GetPersistentClassInfo(objectToUpdate.GetType());

                    metadata.SetPropertyValues(objectToUpdate, dic, EntityMode.Poco);

                    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 update function.", "UpdateFunction", ex));
                }
            }
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 protected void CustomDataSource_Updating(object sender, UpdatingEventArgs e)
 {
 }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="keys"></param>
        /// <param name="values"></param>
        /// <param name="oldValues"></param>
        /// <returns></returns>
        protected override int ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues)
        {
            if (owner.UpdateFunction == null)
                throw new DelegateNotFoundException("UpdateFunction", "The update function doesn't implemented.");

            if (owner.IdentifierFunction == null)
                throw new DelegateNotFoundException("IdentifierFunction", "The identifier function doesn't implemented.");

            var eventArg = new UpdatingEventArgs(owner.SourceType, owner.IdentifierFunction.Invoke(keys), values, oldValues);
            owner.OnUpdating(eventArg);

            if (eventArg.Cancel)
                return 0;

            var updateActionEvent = new ActionEventArgs<UpdatingEventArgs, IPersisterResult>(eventArg, owner.UpdateFunction);

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

            owner.OnUpdated(EventArgs.Empty);
            OnDataSourceViewChanged(EventArgs.Empty);
            return 1;
        }
 internal void OnUpdating(UpdatingEventArgs e)
 {
     if (Updating != null) Updating(this, e);
 }