/// <summary>
 /// Executes the non query.
 /// </summary>
 /// <param name="transactionManager">The transaction manager.</param>
 /// <param name="commandWrapper">The command wrapper.</param>
 public override void ExecuteNonQuery(TransactionManager transactionManager, DbCommand commandWrapper)
 {
     SqlDatabase database = new SqlDatabase(this._connectionString);
     database.ExecuteNonQuery(commandWrapper, transactionManager.TransactionObject);
 }
        /// <summary>
        /// 	Inserts a Library.BLL.Employee object into the datasource using a transaction.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.Employee object to insert.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.Employee object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Insert(TransactionManager transactionManager, Library.BLL.Employee entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Employee_Insert", _useStoredProcedure);

            database.AddOutParameter(commandWrapper, "@ID", DbType.Int32, 4);
            database.AddInParameter(commandWrapper, "@UserName", DbType.String, entity.UserName );
            database.AddInParameter(commandWrapper, "@Password", DbType.String, entity.Password );
            database.AddInParameter(commandWrapper, "@Last_Login", DbType.DateTime, (entity.Last_Login.HasValue ? (object) entity.Last_Login  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@Last_Logout", DbType.DateTime, entity.Last_Logout );
            database.AddInParameter(commandWrapper, "@Is_Online", DbType.Boolean, (entity.Is_Online.HasValue ? (object) entity.Is_Online  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@Is_Active", DbType.Boolean, (entity.Is_Active.HasValue ? (object) entity.Is_Active  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@Is_Admin", DbType.Boolean, (entity.Is_Admin.HasValue ? (object) entity.Is_Admin  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@First_Name", DbType.String, entity.First_Name );
            database.AddInParameter(commandWrapper, "@Last_Name", DbType.String, entity.Last_Name );
            database.AddInParameter(commandWrapper, "@Email", DbType.String, entity.Email );
            database.AddInParameter(commandWrapper, "@Country", DbType.String, entity.Country );
            database.AddInParameter(commandWrapper, "@City", DbType.String, entity.City );
            database.AddInParameter(commandWrapper, "@Address", DbType.String, entity.Address );
            database.AddInParameter(commandWrapper, "@Mobile", DbType.String, entity.Mobile );
            database.AddInParameter(commandWrapper, "@Phone", DbType.String, entity.Phone );
            database.AddInParameter(commandWrapper, "@Postion", DbType.String, entity.Postion );
            database.AddInParameter(commandWrapper, "@Is_Deleted", DbType.Boolean, (entity.Is_Deleted.HasValue ? (object) entity.Is_Deleted  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@CreatedOn", DbType.DateTime, (entity.CreatedOn.HasValue ? (object) entity.CreatedOn  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@CreatedBy", DbType.Int32, (entity.CreatedBy.HasValue ? (object) entity.CreatedBy  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@UpdatedOn", DbType.DateTime, (entity.UpdatedOn.HasValue ? (object) entity.UpdatedOn  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@UpdatedBy", DbType.Int32, (entity.UpdatedBy.HasValue ? (object) entity.UpdatedBy  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@DeletedOn", DbType.DateTime, (entity.DeletedOn.HasValue ? (object) entity.DeletedOn  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@DeletedBy", DbType.Int32, (entity.DeletedBy.HasValue ? (object) entity.DeletedBy  : System.DBNull.Value));

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Insert", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            object _iD = database.GetParameterValue(commandWrapper, "@ID");
            entity.ID = (System.Int32)_iD;

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Insert", entity));

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// 	Gets rows from the datasource based on the PK_Image index.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="_iD"></param>
        /// <param name="start">Row number at which to start reading.</param>
        /// <param name="pageLength">Number of rows to return.</param>
        /// <param name="count">out parameter to get total records for query.</param>
        /// <returns>Returns an instance of the <see cref="Library.BLL.BookImage"/> class.</returns>
        /// <remarks></remarks>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override Library.BLL.BookImage GetByID(TransactionManager transactionManager, System.Int32 _iD, int start, int pageLength, out int count)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_GetByID", _useStoredProcedure);

                database.AddInParameter(commandWrapper, "@ID", DbType.Int32, _iD);

            IDataReader reader = null;
            TList<BookImage> tmp = new TList<BookImage>();
            try
            {
                //Provider Data Requesting Command Event
                OnDataRequesting(new CommandEventArgs(commandWrapper, "GetByID", tmp));

                if (transactionManager != null)
                {
                    reader = Utility.ExecuteReader(transactionManager, commandWrapper);
                }
                else
                {
                    reader = Utility.ExecuteReader(database, commandWrapper);
                }

                //Create collection and fill
                Fill(reader, tmp, start, pageLength);
                count = -1;
                if(reader.NextResult())
                {
                    if(reader.Read())
                    {
                        count = reader.GetInt32(0);
                    }
                }

                //Provider Data Requested Command Event
                OnDataRequested(new CommandEventArgs(commandWrapper, "GetByID", tmp));
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                commandWrapper = null;
            }

            if (tmp.Count == 1)
            {
                return tmp[0];
            }
            else if (tmp.Count == 0)
            {
                return null;
            }
            else
            {
                throw new DataException("Cannot find the unique instance of the class.");
            }

            //return rows;
        }
        /// <summary>
        /// 	Inserts a Library.BLL.BookImage object into the datasource using a transaction.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.BookImage object to insert.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.BookImage object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Insert(TransactionManager transactionManager, Library.BLL.BookImage entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_Insert", _useStoredProcedure);

            database.AddOutParameter(commandWrapper, "@ID", DbType.Int32, 4);
            database.AddInParameter(commandWrapper, "@Name", DbType.String, entity.Name );
            database.AddInParameter(commandWrapper, "@Format", DbType.String, entity.Format );
            database.AddInParameter(commandWrapper, "@Size", DbType.String, entity.Size );
            database.AddInParameter(commandWrapper, "@Link", DbType.String, entity.Link );
            database.AddInParameter(commandWrapper, "@IsAvailable", DbType.String, entity.IsAvailable );

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Insert", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            object _iD = database.GetParameterValue(commandWrapper, "@ID");
            entity.ID = (System.Int32)_iD;

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Insert", entity));

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// 	Deletes a row from the DataSource.
        /// </summary>
        /// <param name="_iD">. Primary Key.</param>	
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <remarks>Deletes based on primary key(s).</remarks>
        /// <returns>Returns true if operation suceeded.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Delete(TransactionManager transactionManager, System.Int32 _iD)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_Delete", _useStoredProcedure);
            database.AddInParameter(commandWrapper, "@ID", DbType.Int32, _iD);

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Delete"));

            int results = 0;

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            //Stop Tracking Now that it has been updated and persisted.
            if (DataRepository.Provider.EnableEntityTracking)
            {
                string entityKey = EntityLocator.ConstructKeyFromPkItems(typeof(BookImage)
                    ,_iD);
                EntityManager.StopTracking(entityKey);

            }

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Delete"));

            commandWrapper = null;

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// 	Returns rows from the DataSource that meet the parameter conditions.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="parameters">A collection of <see cref="SqlFilterParameter"/> objects.</param>
        /// <param name="orderBy">Specifies the sort criteria for the rows in the DataSource (Name ASC; BirthDay DESC, Name ASC);</param>
        /// <param name="start">Row number at which to start reading.</param>
        /// <param name="pageLength">Number of rows to return.</param>
        /// <param name="count">out. The number of rows that match this query.</param>
        /// <returns>Returns a typed collection of Library.BLL.BookImage objects.</returns>
        public override TList<BookImage> Find(TransactionManager transactionManager, IFilterParameterCollection parameters, string orderBy, int start, int pageLength, out int count)
        {
            SqlFilterParameterCollection filter = null;

            if (parameters == null)
                filter = new SqlFilterParameterCollection();
            else
                filter = parameters.GetParameters();

            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_Find_Dynamic", typeof(BookImageColumn), filter, orderBy, start, pageLength);

            SqlFilterParameter param;

            for ( int i = 0; i < filter.Count; i++ )
            {
                param = filter[i];
                database.AddInParameter(commandWrapper, param.Name, param.DbType, param.GetValue());
            }

            TList<BookImage> rows = new TList<BookImage>();
            IDataReader reader = null;

            try
            {
                //Provider Data Requesting Command Event
                OnDataRequesting(new CommandEventArgs(commandWrapper, "Find", rows));

                if ( transactionManager != null )
                {
                    reader = Utility.ExecuteReader(transactionManager, commandWrapper);
                }
                else
                {
                    reader = Utility.ExecuteReader(database, commandWrapper);
                }

                Fill(reader, rows, 0, int.MaxValue);
                count = rows.Count;

                if ( reader.NextResult() )
                {
                    if ( reader.Read() )
                    {
                        count = reader.GetInt32(0);
                    }
                }

                //Provider Data Requested Command Event
                OnDataRequested(new CommandEventArgs(commandWrapper, "Find", rows));
            }
            finally
            {
                if ( reader != null )
                    reader.Close();

                commandWrapper = null;
            }

            return rows;
        }
        /// <summary>
        /// 	Inserts a Library.BLL.Course object into the datasource using a transaction.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.Course object to insert.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.Course object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Insert(TransactionManager transactionManager, Library.BLL.Course entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Course_Insert", _useStoredProcedure);

            database.AddOutParameter(commandWrapper, "@ID", DbType.Int32, 4);
            database.AddInParameter(commandWrapper, "@Course_Name", DbType.String, entity.Course_Name );
            database.AddInParameter(commandWrapper, "@Course_Scope", DbType.Int32, entity.Course_Scope );
            database.AddInParameter(commandWrapper, "@Duration", DbType.Int32, entity.Duration );
            database.AddInParameter(commandWrapper, "@DurationType_ID", DbType.Int32, entity.DurationType_ID );
            database.AddInParameter(commandWrapper, "@Is_Deleted", DbType.Boolean, (entity.Is_Deleted.HasValue ? (object) entity.Is_Deleted  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@CreatedOn", DbType.DateTime, (entity.CreatedOn.HasValue ? (object) entity.CreatedOn  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@CreatedBy", DbType.Int32, (entity.CreatedBy.HasValue ? (object) entity.CreatedBy  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@UpdatedOn", DbType.DateTime, (entity.UpdatedOn.HasValue ? (object) entity.UpdatedOn  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@UpdatedBy", DbType.Int32, (entity.UpdatedBy.HasValue ? (object) entity.UpdatedBy  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@DeletedOn", DbType.DateTime, (entity.DeletedOn.HasValue ? (object) entity.DeletedOn  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@DeletedBy", DbType.Int32, (entity.DeletedBy.HasValue ? (object) entity.DeletedBy  : System.DBNull.Value));

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Insert", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            object _iD = database.GetParameterValue(commandWrapper, "@ID");
            entity.ID = (System.Int32)_iD;

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Insert", entity));

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// 	Gets rows from the datasource based on the FK_Book_Author_Book key.
        ///		FK_Book_Author_Book Description: 
        /// </summary>
        /// <param name="start">Row number at which to start reading.</param>
        /// <param name="pageLength">Number of rows to return.</param>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="_book_ID"></param>
        /// <param name="count">out parameter to get total records for query</param>
        /// <remarks></remarks>
        /// <returns>Returns a typed collection of Library.BLL.Book_Author objects.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override TList<Book_Author> GetByBook_ID(TransactionManager transactionManager, System.Int32 _book_ID, int start, int pageLength, out int count)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Book_Author_GetByBook_ID", _useStoredProcedure);

                database.AddInParameter(commandWrapper, "@Book_ID", DbType.Int32, _book_ID);

            IDataReader reader = null;
            TList<Book_Author> rows = new TList<Book_Author>();
            try
            {
                //Provider Data Requesting Command Event
                OnDataRequesting(new CommandEventArgs(commandWrapper, "GetByBook_ID", rows));

                if (transactionManager != null)
                {
                    reader = Utility.ExecuteReader(transactionManager, commandWrapper);
                }
                else
                {
                    reader = Utility.ExecuteReader(database, commandWrapper);
                }

                //Create Collection
                Fill(reader, rows, start, pageLength);
                count = -1;
                if(reader.NextResult())
                {
                    if(reader.Read())
                    {
                        count = reader.GetInt32(0);
                    }
                }

                //Provider Data Requested Command Event
                OnDataRequested(new CommandEventArgs(commandWrapper, "GetByBook_ID", rows));
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                commandWrapper = null;
            }
            return rows;
        }
 /// <summary>
 /// Executes the scalar.
 /// </summary>
 /// <param name="transactionManager">The transaction manager.</param>
 /// <param name="commandType">Type of the command.</param>
 /// <param name="commandText">The command text.</param>
 /// <returns></returns>
 public override object ExecuteScalar(TransactionManager transactionManager, CommandType commandType, string commandText)
 {
     Database database = transactionManager.Database;
     return database.ExecuteScalar(transactionManager.TransactionObject , commandType, commandText);
 }
        /// <summary>
        /// Lets you efficiently bulk insert many entities to the database.
        /// </summary>
        /// <param name="transactionManager">The transaction manager.</param>
        /// <param name="entities">The entities.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.Course object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        public override void BulkInsert(TransactionManager transactionManager, TList<Library.BLL.Course> entities)
        {
            //System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);

            System.Data.SqlClient.SqlBulkCopy bulkCopy = null;

            if (transactionManager != null && transactionManager.IsOpen)
            {
                System.Data.SqlClient.SqlConnection cnx = transactionManager.TransactionObject.Connection as System.Data.SqlClient.SqlConnection;
                System.Data.SqlClient.SqlTransaction transaction = transactionManager.TransactionObject as System.Data.SqlClient.SqlTransaction;
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(cnx, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints, transaction); //, null);
            }
            else
            {
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);
            }

            bulkCopy.BulkCopyTimeout = 360;
            bulkCopy.DestinationTableName = "Course";

            DataTable dataTable = new DataTable();
            DataColumn col0 = dataTable.Columns.Add("ID", typeof(System.Int32));
            col0.AllowDBNull = false;
            DataColumn col1 = dataTable.Columns.Add("Course_Name", typeof(System.String));
            col1.AllowDBNull = false;
            DataColumn col2 = dataTable.Columns.Add("Course_Scope", typeof(System.Int32));
            col2.AllowDBNull = false;
            DataColumn col3 = dataTable.Columns.Add("Duration", typeof(System.Int32));
            col3.AllowDBNull = false;
            DataColumn col4 = dataTable.Columns.Add("DurationType_ID", typeof(System.Int32));
            col4.AllowDBNull = false;
            DataColumn col5 = dataTable.Columns.Add("Is_Deleted", typeof(System.Boolean));
            col5.AllowDBNull = true;
            DataColumn col6 = dataTable.Columns.Add("CreatedOn", typeof(System.DateTime));
            col6.AllowDBNull = true;
            DataColumn col7 = dataTable.Columns.Add("CreatedBy", typeof(System.Int32));
            col7.AllowDBNull = true;
            DataColumn col8 = dataTable.Columns.Add("UpdatedOn", typeof(System.DateTime));
            col8.AllowDBNull = true;
            DataColumn col9 = dataTable.Columns.Add("UpdatedBy", typeof(System.Int32));
            col9.AllowDBNull = true;
            DataColumn col10 = dataTable.Columns.Add("DeletedOn", typeof(System.DateTime));
            col10.AllowDBNull = true;
            DataColumn col11 = dataTable.Columns.Add("DeletedBy", typeof(System.Int32));
            col11.AllowDBNull = true;

            bulkCopy.ColumnMappings.Add("ID", "ID");
            bulkCopy.ColumnMappings.Add("Course_Name", "Course_Name");
            bulkCopy.ColumnMappings.Add("Course_Scope", "Course_Scope");
            bulkCopy.ColumnMappings.Add("Duration", "Duration");
            bulkCopy.ColumnMappings.Add("DurationType_ID", "DurationType_ID");
            bulkCopy.ColumnMappings.Add("Is_Deleted", "Is_Deleted");
            bulkCopy.ColumnMappings.Add("CreatedOn", "CreatedOn");
            bulkCopy.ColumnMappings.Add("CreatedBy", "CreatedBy");
            bulkCopy.ColumnMappings.Add("UpdatedOn", "UpdatedOn");
            bulkCopy.ColumnMappings.Add("UpdatedBy", "UpdatedBy");
            bulkCopy.ColumnMappings.Add("DeletedOn", "DeletedOn");
            bulkCopy.ColumnMappings.Add("DeletedBy", "DeletedBy");

            foreach(Library.BLL.Course entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                DataRow row = dataTable.NewRow();

                    row["ID"] = entity.ID;

                    row["Course_Name"] = entity.Course_Name;

                    row["Course_Scope"] = entity.Course_Scope;

                    row["Duration"] = entity.Duration;

                    row["DurationType_ID"] = entity.DurationType_ID;

                    row["Is_Deleted"] = entity.Is_Deleted.HasValue ? (object) entity.Is_Deleted  : System.DBNull.Value;

                    row["CreatedOn"] = entity.CreatedOn.HasValue ? (object) entity.CreatedOn  : System.DBNull.Value;

                    row["CreatedBy"] = entity.CreatedBy.HasValue ? (object) entity.CreatedBy  : System.DBNull.Value;

                    row["UpdatedOn"] = entity.UpdatedOn.HasValue ? (object) entity.UpdatedOn  : System.DBNull.Value;

                    row["UpdatedBy"] = entity.UpdatedBy.HasValue ? (object) entity.UpdatedBy  : System.DBNull.Value;

                    row["DeletedOn"] = entity.DeletedOn.HasValue ? (object) entity.DeletedOn  : System.DBNull.Value;

                    row["DeletedBy"] = entity.DeletedBy.HasValue ? (object) entity.DeletedBy  : System.DBNull.Value;

                dataTable.Rows.Add(row);
            }

            // send the data to the server
            bulkCopy.WriteToServer(dataTable);

            // update back the state
            foreach(Library.BLL.Course entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                entity.AcceptChanges();
            }
        }
 /// <summary>
 /// Executes the scalar.
 /// </summary>
 /// <param name="transactionManager">The transaction manager.</param>
 /// <param name="commandWrapper">The command wrapper.</param>
 /// <returns></returns>
 public override object ExecuteScalar(TransactionManager transactionManager, DbCommand commandWrapper)
 {
     Database database = transactionManager.Database;
     return database.ExecuteScalar(commandWrapper, transactionManager.TransactionObject);
 }
 /// <summary>
 /// Executes the scalar.
 /// </summary>
 /// <param name="transactionManager">The transaction manager.</param>
 /// <param name="storedProcedureName">Name of the stored procedure.</param>
 /// <param name="parameterValues">The parameter values.</param>
 /// <returns></returns>
 public override object ExecuteScalar(TransactionManager transactionManager, string storedProcedureName, params object[] parameterValues)
 {
     Database database = transactionManager.Database;
     return database.ExecuteScalar(transactionManager.TransactionObject, storedProcedureName, parameterValues);
 }
 /// <summary>
 /// Executes the non query.
 /// </summary>
 /// <param name="transactionManager">The transaction manager.</param>
 /// <param name="commandType">Type of the command.</param>
 /// <param name="commandText">The command text.</param>
 /// <returns></returns>
 public override int ExecuteNonQuery(TransactionManager transactionManager, CommandType commandType, string commandText)
 {
     Database database = transactionManager.Database;
     return database.ExecuteNonQuery(transactionManager.TransactionObject , commandType, commandText);
 }
        /// <summary>
        /// Lets you efficiently bulk insert many entities to the database.
        /// </summary>
        /// <param name="transactionManager">The transaction manager.</param>
        /// <param name="entities">The entities.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.Book object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        public override void BulkInsert(TransactionManager transactionManager, TList<Library.BLL.Book> entities)
        {
            //System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);

            System.Data.SqlClient.SqlBulkCopy bulkCopy = null;

            if (transactionManager != null && transactionManager.IsOpen)
            {
                System.Data.SqlClient.SqlConnection cnx = transactionManager.TransactionObject.Connection as System.Data.SqlClient.SqlConnection;
                System.Data.SqlClient.SqlTransaction transaction = transactionManager.TransactionObject as System.Data.SqlClient.SqlTransaction;
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(cnx, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints, transaction); //, null);
            }
            else
            {
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);
            }

            bulkCopy.BulkCopyTimeout = 360;
            bulkCopy.DestinationTableName = "Book";

            DataTable dataTable = new DataTable();
            DataColumn col0 = dataTable.Columns.Add("ID", typeof(System.Int32));
            col0.AllowDBNull = false;
            DataColumn col1 = dataTable.Columns.Add("Name", typeof(System.String));
            col1.AllowDBNull = false;
            DataColumn col2 = dataTable.Columns.Add("Publisher", typeof(System.String));
            col2.AllowDBNull = false;
            DataColumn col3 = dataTable.Columns.Add("Publish_Date", typeof(System.DateTime));
            col3.AllowDBNull = true;
            DataColumn col4 = dataTable.Columns.Add("IsAvailablePdf", typeof(System.Boolean));
            col4.AllowDBNull = true;
            DataColumn col5 = dataTable.Columns.Add("IsAvailablePaper", typeof(System.Boolean));
            col5.AllowDBNull = true;
            DataColumn col6 = dataTable.Columns.Add("IsBorrowed", typeof(System.Boolean));
            col6.AllowDBNull = false;
            DataColumn col7 = dataTable.Columns.Add("User_ID", typeof(System.Int32));
            col7.AllowDBNull = false;
            DataColumn col8 = dataTable.Columns.Add("BorrowDate", typeof(System.DateTime));
            col8.AllowDBNull = true;
            DataColumn col9 = dataTable.Columns.Add("Borrow_Times", typeof(System.Int32));
            col9.AllowDBNull = true;
            DataColumn col10 = dataTable.Columns.Add("IsLost", typeof(System.Boolean));
            col10.AllowDBNull = true;
            DataColumn col11 = dataTable.Columns.Add("Type_ID", typeof(System.Int32));
            col11.AllowDBNull = false;
            DataColumn col12 = dataTable.Columns.Add("Publisher_ID", typeof(System.Int32));
            col12.AllowDBNull = false;
            DataColumn col13 = dataTable.Columns.Add("Papers_no", typeof(System.Int32));
            col13.AllowDBNull = true;
            DataColumn col14 = dataTable.Columns.Add("Introducer_ID", typeof(System.Int32));
            col14.AllowDBNull = true;
            DataColumn col15 = dataTable.Columns.Add("EmployeeI_D", typeof(System.Int32));
            col15.AllowDBNull = false;
            DataColumn col16 = dataTable.Columns.Add("Size", typeof(System.Double));
            col16.AllowDBNull = true;
            DataColumn col17 = dataTable.Columns.Add("Price", typeof(System.Int32));
            col17.AllowDBNull = true;
            DataColumn col18 = dataTable.Columns.Add("Pdf_Link", typeof(System.String));
            col18.AllowDBNull = true;
            DataColumn col19 = dataTable.Columns.Add("Image_ID", typeof(System.Int32));
            col19.AllowDBNull = false;
            DataColumn col20 = dataTable.Columns.Add("ISBN", typeof(System.String));
            col20.AllowDBNull = true;
            DataColumn col21 = dataTable.Columns.Add("CreatedOn", typeof(System.DateTime));
            col21.AllowDBNull = true;
            DataColumn col22 = dataTable.Columns.Add("CreatedBy", typeof(System.Int32));
            col22.AllowDBNull = true;
            DataColumn col23 = dataTable.Columns.Add("UpdatedOn", typeof(System.DateTime));
            col23.AllowDBNull = true;
            DataColumn col24 = dataTable.Columns.Add("UpdatedBy", typeof(System.Int32));
            col24.AllowDBNull = true;
            DataColumn col25 = dataTable.Columns.Add("DeletedOn", typeof(System.DateTime));
            col25.AllowDBNull = true;
            DataColumn col26 = dataTable.Columns.Add("DeletedBy", typeof(System.Int32));
            col26.AllowDBNull = true;

            bulkCopy.ColumnMappings.Add("ID", "ID");
            bulkCopy.ColumnMappings.Add("Name", "Name");
            bulkCopy.ColumnMappings.Add("Publisher", "Publisher");
            bulkCopy.ColumnMappings.Add("Publish_Date", "Publish_Date");
            bulkCopy.ColumnMappings.Add("IsAvailablePdf", "IsAvailablePdf");
            bulkCopy.ColumnMappings.Add("IsAvailablePaper", "IsAvailablePaper");
            bulkCopy.ColumnMappings.Add("IsBorrowed", "IsBorrowed");
            bulkCopy.ColumnMappings.Add("User_ID", "User_ID");
            bulkCopy.ColumnMappings.Add("BorrowDate", "BorrowDate");
            bulkCopy.ColumnMappings.Add("Borrow_Times", "Borrow_Times");
            bulkCopy.ColumnMappings.Add("IsLost", "IsLost");
            bulkCopy.ColumnMappings.Add("Type_ID", "Type_ID");
            bulkCopy.ColumnMappings.Add("Publisher_ID", "Publisher_ID");
            bulkCopy.ColumnMappings.Add("Papers_no", "Papers_no");
            bulkCopy.ColumnMappings.Add("Introducer_ID", "Introducer_ID");
            bulkCopy.ColumnMappings.Add("EmployeeI_D", "EmployeeI_D");
            bulkCopy.ColumnMappings.Add("Size", "Size");
            bulkCopy.ColumnMappings.Add("Price", "Price");
            bulkCopy.ColumnMappings.Add("Pdf_Link", "Pdf_Link");
            bulkCopy.ColumnMappings.Add("Image_ID", "Image_ID");
            bulkCopy.ColumnMappings.Add("ISBN", "ISBN");
            bulkCopy.ColumnMappings.Add("CreatedOn", "CreatedOn");
            bulkCopy.ColumnMappings.Add("CreatedBy", "CreatedBy");
            bulkCopy.ColumnMappings.Add("UpdatedOn", "UpdatedOn");
            bulkCopy.ColumnMappings.Add("UpdatedBy", "UpdatedBy");
            bulkCopy.ColumnMappings.Add("DeletedOn", "DeletedOn");
            bulkCopy.ColumnMappings.Add("DeletedBy", "DeletedBy");

            foreach(Library.BLL.Book entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                DataRow row = dataTable.NewRow();

                    row["ID"] = entity.ID;

                    row["Name"] = entity.Name;

                    row["Publisher"] = entity.Publisher;

                    row["Publish_Date"] = entity.Publish_Date.HasValue ? (object) entity.Publish_Date  : System.DBNull.Value;

                    row["IsAvailablePdf"] = entity.IsAvailablePdf.HasValue ? (object) entity.IsAvailablePdf  : System.DBNull.Value;

                    row["IsAvailablePaper"] = entity.IsAvailablePaper.HasValue ? (object) entity.IsAvailablePaper  : System.DBNull.Value;

                    row["IsBorrowed"] = entity.IsBorrowed;

                    row["User_ID"] = entity.User_ID;

                    row["BorrowDate"] = entity.BorrowDate.HasValue ? (object) entity.BorrowDate  : System.DBNull.Value;

                    row["Borrow_Times"] = entity.Borrow_Times.HasValue ? (object) entity.Borrow_Times  : System.DBNull.Value;

                    row["IsLost"] = entity.IsLost.HasValue ? (object) entity.IsLost  : System.DBNull.Value;

                    row["Type_ID"] = entity.Type_ID;

                    row["Publisher_ID"] = entity.Publisher_ID;

                    row["Papers_no"] = entity.Papers_no.HasValue ? (object) entity.Papers_no  : System.DBNull.Value;

                    row["Introducer_ID"] = entity.Introducer_ID.HasValue ? (object) entity.Introducer_ID  : System.DBNull.Value;

                    row["EmployeeI_D"] = entity.EmployeeI_D;

                    row["Size"] = entity.Size.HasValue ? (object) entity.Size  : System.DBNull.Value;

                    row["Price"] = entity.Price.HasValue ? (object) entity.Price  : System.DBNull.Value;

                    row["Pdf_Link"] = entity.Pdf_Link;

                    row["Image_ID"] = entity.Image_ID;

                    row["ISBN"] = entity.ISBN;

                    row["CreatedOn"] = entity.CreatedOn.HasValue ? (object) entity.CreatedOn  : System.DBNull.Value;

                    row["CreatedBy"] = entity.CreatedBy.HasValue ? (object) entity.CreatedBy  : System.DBNull.Value;

                    row["UpdatedOn"] = entity.UpdatedOn.HasValue ? (object) entity.UpdatedOn  : System.DBNull.Value;

                    row["UpdatedBy"] = entity.UpdatedBy.HasValue ? (object) entity.UpdatedBy  : System.DBNull.Value;

                    row["DeletedOn"] = entity.DeletedOn.HasValue ? (object) entity.DeletedOn  : System.DBNull.Value;

                    row["DeletedBy"] = entity.DeletedBy.HasValue ? (object) entity.DeletedBy  : System.DBNull.Value;

                dataTable.Rows.Add(row);
            }

            // send the data to the server
            bulkCopy.WriteToServer(dataTable);

            // update back the state
            foreach(Library.BLL.Book entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                entity.AcceptChanges();
            }
        }
        /// <summary>
        /// 	Update an existing row in the datasource.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.Course object to update.</param>
        /// <remarks>
        ///		After updating the datasource, the Library.BLL.Course object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Update(TransactionManager transactionManager, Library.BLL.Course entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Course_Update", _useStoredProcedure);

            database.AddInParameter(commandWrapper, "@ID", DbType.Int32, entity.ID );
            database.AddInParameter(commandWrapper, "@Course_Name", DbType.String, entity.Course_Name );
            database.AddInParameter(commandWrapper, "@Course_Scope", DbType.Int32, entity.Course_Scope );
            database.AddInParameter(commandWrapper, "@Duration", DbType.Int32, entity.Duration );
            database.AddInParameter(commandWrapper, "@DurationType_ID", DbType.Int32, entity.DurationType_ID );
            database.AddInParameter(commandWrapper, "@Is_Deleted", DbType.Boolean, (entity.Is_Deleted.HasValue ? (object) entity.Is_Deleted : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@CreatedOn", DbType.DateTime, (entity.CreatedOn.HasValue ? (object) entity.CreatedOn : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@CreatedBy", DbType.Int32, (entity.CreatedBy.HasValue ? (object) entity.CreatedBy : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@UpdatedOn", DbType.DateTime, (entity.UpdatedOn.HasValue ? (object) entity.UpdatedOn : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@UpdatedBy", DbType.Int32, (entity.UpdatedBy.HasValue ? (object) entity.UpdatedBy : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@DeletedOn", DbType.DateTime, (entity.DeletedOn.HasValue ? (object) entity.DeletedOn : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@DeletedBy", DbType.Int32, (entity.DeletedBy.HasValue ? (object) entity.DeletedBy : System.DBNull.Value) );

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Update", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            //Stop Tracking Now that it has been updated and persisted.
            if (DataRepository.Provider.EnableEntityTracking)
            {
                EntityManager.StopTracking(entity.EntityTrackingKey);
            }

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Update", entity));

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// 	Update an existing row in the datasource.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.Book object to update.</param>
        /// <remarks>
        ///		After updating the datasource, the Library.BLL.Book object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Update(TransactionManager transactionManager, Library.BLL.Book entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Book_Update", _useStoredProcedure);

            database.AddInParameter(commandWrapper, "@ID", DbType.Int32, entity.ID );
            database.AddInParameter(commandWrapper, "@Name", DbType.String, entity.Name );
            database.AddInParameter(commandWrapper, "@Publisher", DbType.String, entity.Publisher );
            database.AddInParameter(commandWrapper, "@Publish_Date", DbType.Date, (entity.Publish_Date.HasValue ? (object) entity.Publish_Date : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@IsAvailablePdf", DbType.Boolean, (entity.IsAvailablePdf.HasValue ? (object) entity.IsAvailablePdf : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@IsAvailablePaper", DbType.Boolean, (entity.IsAvailablePaper.HasValue ? (object) entity.IsAvailablePaper : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@IsBorrowed", DbType.Boolean, entity.IsBorrowed );
            database.AddInParameter(commandWrapper, "@User_ID", DbType.Int32, entity.User_ID );
            database.AddInParameter(commandWrapper, "@BorrowDate", DbType.Date, (entity.BorrowDate.HasValue ? (object) entity.BorrowDate : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@Borrow_Times", DbType.Int32, (entity.Borrow_Times.HasValue ? (object) entity.Borrow_Times : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@IsLost", DbType.Boolean, (entity.IsLost.HasValue ? (object) entity.IsLost : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@Type_ID", DbType.Int32, entity.Type_ID );
            database.AddInParameter(commandWrapper, "@Publisher_ID", DbType.Int32, entity.Publisher_ID );
            database.AddInParameter(commandWrapper, "@Papers_no", DbType.Int32, (entity.Papers_no.HasValue ? (object) entity.Papers_no : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@Introducer_ID", DbType.Int32, (entity.Introducer_ID.HasValue ? (object) entity.Introducer_ID : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@EmployeeI_D", DbType.Int32, entity.EmployeeI_D );
            database.AddInParameter(commandWrapper, "@Size", DbType.Double, (entity.Size.HasValue ? (object) entity.Size : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@Price", DbType.Int32, (entity.Price.HasValue ? (object) entity.Price : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@Pdf_Link", DbType.String, entity.Pdf_Link );
            database.AddInParameter(commandWrapper, "@Image_ID", DbType.Int32, entity.Image_ID );
            database.AddInParameter(commandWrapper, "@ISBN", DbType.String, entity.ISBN );
            database.AddInParameter(commandWrapper, "@CreatedOn", DbType.DateTime, (entity.CreatedOn.HasValue ? (object) entity.CreatedOn : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@CreatedBy", DbType.Int32, (entity.CreatedBy.HasValue ? (object) entity.CreatedBy : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@UpdatedOn", DbType.DateTime, (entity.UpdatedOn.HasValue ? (object) entity.UpdatedOn : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@UpdatedBy", DbType.Int32, (entity.UpdatedBy.HasValue ? (object) entity.UpdatedBy : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@DeletedOn", DbType.DateTime, (entity.DeletedOn.HasValue ? (object) entity.DeletedOn : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@DeletedBy", DbType.Int32, (entity.DeletedBy.HasValue ? (object) entity.DeletedBy : System.DBNull.Value) );

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Update", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            //Stop Tracking Now that it has been updated and persisted.
            if (DataRepository.Provider.EnableEntityTracking)
            {
                EntityManager.StopTracking(entity.EntityTrackingKey);
            }

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Update", entity));

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// Lets you efficiently bulk insert many entities to the database.
        /// </summary>
        /// <param name="transactionManager">The transaction manager.</param>
        /// <param name="entities">The entities.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.Publisher object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        public override void BulkInsert(TransactionManager transactionManager, TList<Library.BLL.Publisher> entities)
        {
            //System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);

            System.Data.SqlClient.SqlBulkCopy bulkCopy = null;

            if (transactionManager != null && transactionManager.IsOpen)
            {
                System.Data.SqlClient.SqlConnection cnx = transactionManager.TransactionObject.Connection as System.Data.SqlClient.SqlConnection;
                System.Data.SqlClient.SqlTransaction transaction = transactionManager.TransactionObject as System.Data.SqlClient.SqlTransaction;
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(cnx, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints, transaction); //, null);
            }
            else
            {
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);
            }

            bulkCopy.BulkCopyTimeout = 360;
            bulkCopy.DestinationTableName = "Publisher";

            DataTable dataTable = new DataTable();
            DataColumn col0 = dataTable.Columns.Add("ID", typeof(System.Int32));
            col0.AllowDBNull = false;
            DataColumn col1 = dataTable.Columns.Add("Name", typeof(System.String));
            col1.AllowDBNull = false;
            DataColumn col2 = dataTable.Columns.Add("Mobile", typeof(System.String));
            col2.AllowDBNull = true;
            DataColumn col3 = dataTable.Columns.Add("Email", typeof(System.String));
            col3.AllowDBNull = true;
            DataColumn col4 = dataTable.Columns.Add("Website", typeof(System.String));
            col4.AllowDBNull = true;
            DataColumn col5 = dataTable.Columns.Add("FounedOn", typeof(System.DateTime));
            col5.AllowDBNull = true;
            DataColumn col6 = dataTable.Columns.Add("Country", typeof(System.String));
            col6.AllowDBNull = true;
            DataColumn col7 = dataTable.Columns.Add("City", typeof(System.String));
            col7.AllowDBNull = true;
            DataColumn col8 = dataTable.Columns.Add("Address", typeof(System.String));
            col8.AllowDBNull = true;

            bulkCopy.ColumnMappings.Add("ID", "ID");
            bulkCopy.ColumnMappings.Add("Name", "Name");
            bulkCopy.ColumnMappings.Add("Mobile", "Mobile");
            bulkCopy.ColumnMappings.Add("Email", "Email");
            bulkCopy.ColumnMappings.Add("Website", "Website");
            bulkCopy.ColumnMappings.Add("FounedOn", "FounedOn");
            bulkCopy.ColumnMappings.Add("Country", "Country");
            bulkCopy.ColumnMappings.Add("City", "City");
            bulkCopy.ColumnMappings.Add("Address", "Address");

            foreach(Library.BLL.Publisher entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                DataRow row = dataTable.NewRow();

                    row["ID"] = entity.ID;

                    row["Name"] = entity.Name;

                    row["Mobile"] = entity.Mobile;

                    row["Email"] = entity.Email;

                    row["Website"] = entity.Website;

                    row["FounedOn"] = entity.FounedOn.HasValue ? (object) entity.FounedOn  : System.DBNull.Value;

                    row["Country"] = entity.Country;

                    row["City"] = entity.City;

                    row["Address"] = entity.Address;

                dataTable.Rows.Add(row);
            }

            // send the data to the server
            bulkCopy.WriteToServer(dataTable);

            // update back the state
            foreach(Library.BLL.Publisher entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                entity.AcceptChanges();
            }
        }
        /// <summary>
        /// Lets you efficiently bulk insert many entities to the database.
        /// </summary>
        /// <param name="transactionManager">The transaction manager.</param>
        /// <param name="entities">The entities.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.BookImage object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        public override void BulkInsert(TransactionManager transactionManager, TList<Library.BLL.BookImage> entities)
        {
            //System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);

            System.Data.SqlClient.SqlBulkCopy bulkCopy = null;

            if (transactionManager != null && transactionManager.IsOpen)
            {
                System.Data.SqlClient.SqlConnection cnx = transactionManager.TransactionObject.Connection as System.Data.SqlClient.SqlConnection;
                System.Data.SqlClient.SqlTransaction transaction = transactionManager.TransactionObject as System.Data.SqlClient.SqlTransaction;
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(cnx, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints, transaction); //, null);
            }
            else
            {
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);
            }

            bulkCopy.BulkCopyTimeout = 360;
            bulkCopy.DestinationTableName = "BookImage";

            DataTable dataTable = new DataTable();
            DataColumn col0 = dataTable.Columns.Add("ID", typeof(System.Int32));
            col0.AllowDBNull = false;
            DataColumn col1 = dataTable.Columns.Add("Name", typeof(System.String));
            col1.AllowDBNull = false;
            DataColumn col2 = dataTable.Columns.Add("Format", typeof(System.String));
            col2.AllowDBNull = true;
            DataColumn col3 = dataTable.Columns.Add("Size", typeof(System.String));
            col3.AllowDBNull = true;
            DataColumn col4 = dataTable.Columns.Add("Link", typeof(System.String));
            col4.AllowDBNull = true;
            DataColumn col5 = dataTable.Columns.Add("IsAvailable", typeof(System.String));
            col5.AllowDBNull = true;

            bulkCopy.ColumnMappings.Add("ID", "ID");
            bulkCopy.ColumnMappings.Add("Name", "Name");
            bulkCopy.ColumnMappings.Add("Format", "Format");
            bulkCopy.ColumnMappings.Add("Size", "Size");
            bulkCopy.ColumnMappings.Add("Link", "Link");
            bulkCopy.ColumnMappings.Add("IsAvailable", "IsAvailable");

            foreach(Library.BLL.BookImage entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                DataRow row = dataTable.NewRow();

                    row["ID"] = entity.ID;

                    row["Name"] = entity.Name;

                    row["Format"] = entity.Format;

                    row["Size"] = entity.Size;

                    row["Link"] = entity.Link;

                    row["IsAvailable"] = entity.IsAvailable;

                dataTable.Rows.Add(row);
            }

            // send the data to the server
            bulkCopy.WriteToServer(dataTable);

            // update back the state
            foreach(Library.BLL.BookImage entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                entity.AcceptChanges();
            }
        }
        /// <summary>
        /// 	Inserts a Library.BLL.Publisher object into the datasource using a transaction.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.Publisher object to insert.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.Publisher object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Insert(TransactionManager transactionManager, Library.BLL.Publisher entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Publisher_Insert", _useStoredProcedure);

            database.AddOutParameter(commandWrapper, "@ID", DbType.Int32, 4);
            database.AddInParameter(commandWrapper, "@Name", DbType.String, entity.Name );
            database.AddInParameter(commandWrapper, "@Mobile", DbType.StringFixedLength, entity.Mobile );
            database.AddInParameter(commandWrapper, "@Email", DbType.String, entity.Email );
            database.AddInParameter(commandWrapper, "@Website", DbType.String, entity.Website );
            database.AddInParameter(commandWrapper, "@FounedOn", DbType.Date, (entity.FounedOn.HasValue ? (object) entity.FounedOn  : System.DBNull.Value));
            database.AddInParameter(commandWrapper, "@Country", DbType.String, entity.Country );
            database.AddInParameter(commandWrapper, "@City", DbType.String, entity.City );
            database.AddInParameter(commandWrapper, "@Address", DbType.String, entity.Address );

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Insert", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            object _iD = database.GetParameterValue(commandWrapper, "@ID");
            entity.ID = (System.Int32)_iD;

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Insert", entity));

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// 	Returns rows meeting the whereClause condition from the DataSource.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="whereClause">Specifies the condition for the rows returned by a query (Name='John Doe', Name='John Doe' AND Id='1', Name='John Doe' OR Id='1').</param>
        /// <param name="start">Row number at which to start reading.</param>
        /// <param name="pageLength">Number of rows to return.</param>
        /// <param name="count">out. The number of rows that match this query.</param>
        /// <remarks>Operators must be capitalized (OR, AND).</remarks>
        /// <returns>Returns a typed collection of Library.BLL.BookImage objects.</returns>
        public override TList<BookImage> Find(TransactionManager transactionManager, string whereClause, int start, int pageLength, out int count)
        {
            count = -1;
            if (whereClause.IndexOf(";") > -1)
                return new TList<BookImage>();

            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_Find", _useStoredProcedure);

            bool searchUsingOR = false;
            if (whereClause.IndexOf(" OR ") > 0) // did they want to do "a=b OR c=d OR..."?
            searchUsingOR = true;

            database.AddInParameter(commandWrapper, "@SearchUsingOR", DbType.Boolean, searchUsingOR);

            database.AddInParameter(commandWrapper, "@ID", DbType.Int32, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Name", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Format", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Size", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Link", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@IsAvailable", DbType.String, DBNull.Value);

            // replace all instances of 'AND' and 'OR' because we already set searchUsingOR
            whereClause = whereClause.Replace(" AND ", "|").Replace(" OR ", "|") ;
            string[] clauses = whereClause.ToLower().Split('|');

            // Here's what's going on below: Find a field, then to get the value we
            // drop the field name from the front, trim spaces, drop the '=' sign,
            // trim more spaces, and drop any outer single quotes.
            // Now handles the case when two fields start off the same way - like "Friendly='Yes' AND Friend='john'"

            char[] equalSign = {'='};
            char[] singleQuote = {'\''};
               		foreach (string clause in clauses)
            {
                if (clause.Trim().StartsWith("id ") || clause.Trim().StartsWith("id="))
                {
                    database.SetParameterValue(commandWrapper, "@ID",
                        clause.Trim().Remove(0,2).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("name ") || clause.Trim().StartsWith("name="))
                {
                    database.SetParameterValue(commandWrapper, "@Name",
                        clause.Trim().Remove(0,4).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("format ") || clause.Trim().StartsWith("format="))
                {
                    database.SetParameterValue(commandWrapper, "@Format",
                        clause.Trim().Remove(0,6).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("size ") || clause.Trim().StartsWith("size="))
                {
                    database.SetParameterValue(commandWrapper, "@Size",
                        clause.Trim().Remove(0,4).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("link ") || clause.Trim().StartsWith("link="))
                {
                    database.SetParameterValue(commandWrapper, "@Link",
                        clause.Trim().Remove(0,4).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("isavailable ") || clause.Trim().StartsWith("isavailable="))
                {
                    database.SetParameterValue(commandWrapper, "@IsAvailable",
                        clause.Trim().Remove(0,11).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }

                throw new ArgumentException("Unable to use this part of the where clause in this version of Find: " + clause);
            }

            IDataReader reader = null;
            //Create Collection
            TList<BookImage> rows = new TList<BookImage>();

            try
            {
                //Provider Data Requesting Command Event
                OnDataRequesting(new CommandEventArgs(commandWrapper, "Find", rows));

                if (transactionManager != null)
                {
                    reader = Utility.ExecuteReader(transactionManager, commandWrapper);
                }
                else
                {
                    reader = Utility.ExecuteReader(database, commandWrapper);
                }

                Fill(reader, rows, start, pageLength);

                if(reader.NextResult())
                {
                    if(reader.Read())
                    {
                        count = reader.GetInt32(0);
                    }
                }

                //Provider Data Requested Command Event
                OnDataRequested(new CommandEventArgs(commandWrapper, "Find", rows));
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                commandWrapper = null;
            }
            return rows;
        }
        /// <summary>
        /// 	Update an existing row in the datasource.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.Publisher object to update.</param>
        /// <remarks>
        ///		After updating the datasource, the Library.BLL.Publisher object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Update(TransactionManager transactionManager, Library.BLL.Publisher entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Publisher_Update", _useStoredProcedure);

            database.AddInParameter(commandWrapper, "@ID", DbType.Int32, entity.ID );
            database.AddInParameter(commandWrapper, "@Name", DbType.String, entity.Name );
            database.AddInParameter(commandWrapper, "@Mobile", DbType.StringFixedLength, entity.Mobile );
            database.AddInParameter(commandWrapper, "@Email", DbType.String, entity.Email );
            database.AddInParameter(commandWrapper, "@Website", DbType.String, entity.Website );
            database.AddInParameter(commandWrapper, "@FounedOn", DbType.Date, (entity.FounedOn.HasValue ? (object) entity.FounedOn : System.DBNull.Value) );
            database.AddInParameter(commandWrapper, "@Country", DbType.String, entity.Country );
            database.AddInParameter(commandWrapper, "@City", DbType.String, entity.City );
            database.AddInParameter(commandWrapper, "@Address", DbType.String, entity.Address );

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Update", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            //Stop Tracking Now that it has been updated and persisted.
            if (DataRepository.Provider.EnableEntityTracking)
            {
                EntityManager.StopTracking(entity.EntityTrackingKey);
            }

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Update", entity));

            return Convert.ToBoolean(results);
        }
        /// <summary>
        /// 	Gets All rows from the DataSource.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="start">Row number at which to start reading.</param>
        /// <param name="pageLength">Number of rows to return.</param>
        /// <param name="count">out. The number of rows that match this query.</param>
        /// <remarks></remarks>
        /// <returns>Returns a typed collection of Library.BLL.BookImage objects.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override TList<BookImage> GetAll(TransactionManager transactionManager, int start, int pageLength, out int count)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_Get_List", _useStoredProcedure);

            IDataReader reader = null;

            //Create Collection
            TList<BookImage> rows = new TList<BookImage>();

            try
            {
                //Provider Data Requesting Command Event
                OnDataRequesting(new CommandEventArgs(commandWrapper, "GetAll", rows));

                if (transactionManager != null)
                {
                    reader = Utility.ExecuteReader(transactionManager, commandWrapper);
                }
                else
                {
                    reader = Utility.ExecuteReader(database, commandWrapper);
                }

                Fill(reader, rows, start, pageLength);
                count = -1;
                if(reader.NextResult())
                {
                    if(reader.Read())
                    {
                        count = reader.GetInt32(0);
                    }
                }

                //Provider Data Requested Command Event
                OnDataRequested(new CommandEventArgs(commandWrapper, "GetAll", rows));
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                commandWrapper = null;
            }
            return rows;
        }
        /// <summary>
        /// Lets you efficiently bulk insert many entities to the database.
        /// </summary>
        /// <param name="transactionManager">The transaction manager.</param>
        /// <param name="entities">The entities.</param>
        /// <remarks>
        ///		After inserting into the datasource, the Library.BLL.Employee object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>	
        public override void BulkInsert(TransactionManager transactionManager, TList<Library.BLL.Employee> entities)
        {
            //System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);

            System.Data.SqlClient.SqlBulkCopy bulkCopy = null;

            if (transactionManager != null && transactionManager.IsOpen)
            {
                System.Data.SqlClient.SqlConnection cnx = transactionManager.TransactionObject.Connection as System.Data.SqlClient.SqlConnection;
                System.Data.SqlClient.SqlTransaction transaction = transactionManager.TransactionObject as System.Data.SqlClient.SqlTransaction;
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(cnx, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints, transaction); //, null);
            }
            else
            {
                bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);
            }

            bulkCopy.BulkCopyTimeout = 360;
            bulkCopy.DestinationTableName = "Employee";

            DataTable dataTable = new DataTable();
            DataColumn col0 = dataTable.Columns.Add("ID", typeof(System.Int32));
            col0.AllowDBNull = false;
            DataColumn col1 = dataTable.Columns.Add("UserName", typeof(System.String));
            col1.AllowDBNull = true;
            DataColumn col2 = dataTable.Columns.Add("Password", typeof(System.String));
            col2.AllowDBNull = true;
            DataColumn col3 = dataTable.Columns.Add("Last_Login", typeof(System.DateTime));
            col3.AllowDBNull = true;
            DataColumn col4 = dataTable.Columns.Add("Last_Logout", typeof(System.DateTime));
            col4.AllowDBNull = false;
            DataColumn col5 = dataTable.Columns.Add("Is_Online", typeof(System.Boolean));
            col5.AllowDBNull = true;
            DataColumn col6 = dataTable.Columns.Add("Is_Active", typeof(System.Boolean));
            col6.AllowDBNull = true;
            DataColumn col7 = dataTable.Columns.Add("Is_Admin", typeof(System.Boolean));
            col7.AllowDBNull = true;
            DataColumn col8 = dataTable.Columns.Add("First_Name", typeof(System.String));
            col8.AllowDBNull = false;
            DataColumn col9 = dataTable.Columns.Add("Last_Name", typeof(System.String));
            col9.AllowDBNull = false;
            DataColumn col10 = dataTable.Columns.Add("Email", typeof(System.String));
            col10.AllowDBNull = false;
            DataColumn col11 = dataTable.Columns.Add("Country", typeof(System.String));
            col11.AllowDBNull = false;
            DataColumn col12 = dataTable.Columns.Add("City", typeof(System.String));
            col12.AllowDBNull = true;
            DataColumn col13 = dataTable.Columns.Add("Address", typeof(System.String));
            col13.AllowDBNull = true;
            DataColumn col14 = dataTable.Columns.Add("Mobile", typeof(System.String));
            col14.AllowDBNull = false;
            DataColumn col15 = dataTable.Columns.Add("Phone", typeof(System.String));
            col15.AllowDBNull = true;
            DataColumn col16 = dataTable.Columns.Add("Postion", typeof(System.String));
            col16.AllowDBNull = true;
            DataColumn col17 = dataTable.Columns.Add("Is_Deleted", typeof(System.Boolean));
            col17.AllowDBNull = true;
            DataColumn col18 = dataTable.Columns.Add("CreatedOn", typeof(System.DateTime));
            col18.AllowDBNull = true;
            DataColumn col19 = dataTable.Columns.Add("CreatedBy", typeof(System.Int32));
            col19.AllowDBNull = true;
            DataColumn col20 = dataTable.Columns.Add("UpdatedOn", typeof(System.DateTime));
            col20.AllowDBNull = true;
            DataColumn col21 = dataTable.Columns.Add("UpdatedBy", typeof(System.Int32));
            col21.AllowDBNull = true;
            DataColumn col22 = dataTable.Columns.Add("DeletedOn", typeof(System.DateTime));
            col22.AllowDBNull = true;
            DataColumn col23 = dataTable.Columns.Add("DeletedBy", typeof(System.Int32));
            col23.AllowDBNull = true;

            bulkCopy.ColumnMappings.Add("ID", "ID");
            bulkCopy.ColumnMappings.Add("UserName", "UserName");
            bulkCopy.ColumnMappings.Add("Password", "Password");
            bulkCopy.ColumnMappings.Add("Last_Login", "Last_Login");
            bulkCopy.ColumnMappings.Add("Last_Logout", "Last_Logout");
            bulkCopy.ColumnMappings.Add("Is_Online", "Is_Online");
            bulkCopy.ColumnMappings.Add("Is_Active", "Is_Active");
            bulkCopy.ColumnMappings.Add("Is_Admin", "Is_Admin");
            bulkCopy.ColumnMappings.Add("First_Name", "First_Name");
            bulkCopy.ColumnMappings.Add("Last_Name", "Last_Name");
            bulkCopy.ColumnMappings.Add("Email", "Email");
            bulkCopy.ColumnMappings.Add("Country", "Country");
            bulkCopy.ColumnMappings.Add("City", "City");
            bulkCopy.ColumnMappings.Add("Address", "Address");
            bulkCopy.ColumnMappings.Add("Mobile", "Mobile");
            bulkCopy.ColumnMappings.Add("Phone", "Phone");
            bulkCopy.ColumnMappings.Add("Postion", "Postion");
            bulkCopy.ColumnMappings.Add("Is_Deleted", "Is_Deleted");
            bulkCopy.ColumnMappings.Add("CreatedOn", "CreatedOn");
            bulkCopy.ColumnMappings.Add("CreatedBy", "CreatedBy");
            bulkCopy.ColumnMappings.Add("UpdatedOn", "UpdatedOn");
            bulkCopy.ColumnMappings.Add("UpdatedBy", "UpdatedBy");
            bulkCopy.ColumnMappings.Add("DeletedOn", "DeletedOn");
            bulkCopy.ColumnMappings.Add("DeletedBy", "DeletedBy");

            foreach(Library.BLL.Employee entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                DataRow row = dataTable.NewRow();

                    row["ID"] = entity.ID;

                    row["UserName"] = entity.UserName;

                    row["Password"] = entity.Password;

                    row["Last_Login"] = entity.Last_Login.HasValue ? (object) entity.Last_Login  : System.DBNull.Value;

                    row["Last_Logout"] = entity.Last_Logout;

                    row["Is_Online"] = entity.Is_Online.HasValue ? (object) entity.Is_Online  : System.DBNull.Value;

                    row["Is_Active"] = entity.Is_Active.HasValue ? (object) entity.Is_Active  : System.DBNull.Value;

                    row["Is_Admin"] = entity.Is_Admin.HasValue ? (object) entity.Is_Admin  : System.DBNull.Value;

                    row["First_Name"] = entity.First_Name;

                    row["Last_Name"] = entity.Last_Name;

                    row["Email"] = entity.Email;

                    row["Country"] = entity.Country;

                    row["City"] = entity.City;

                    row["Address"] = entity.Address;

                    row["Mobile"] = entity.Mobile;

                    row["Phone"] = entity.Phone;

                    row["Postion"] = entity.Postion;

                    row["Is_Deleted"] = entity.Is_Deleted.HasValue ? (object) entity.Is_Deleted  : System.DBNull.Value;

                    row["CreatedOn"] = entity.CreatedOn.HasValue ? (object) entity.CreatedOn  : System.DBNull.Value;

                    row["CreatedBy"] = entity.CreatedBy.HasValue ? (object) entity.CreatedBy  : System.DBNull.Value;

                    row["UpdatedOn"] = entity.UpdatedOn.HasValue ? (object) entity.UpdatedOn  : System.DBNull.Value;

                    row["UpdatedBy"] = entity.UpdatedBy.HasValue ? (object) entity.UpdatedBy  : System.DBNull.Value;

                    row["DeletedOn"] = entity.DeletedOn.HasValue ? (object) entity.DeletedOn  : System.DBNull.Value;

                    row["DeletedBy"] = entity.DeletedBy.HasValue ? (object) entity.DeletedBy  : System.DBNull.Value;

                dataTable.Rows.Add(row);
            }

            // send the data to the server
            bulkCopy.WriteToServer(dataTable);

            // update back the state
            foreach(Library.BLL.Employee entity in entities)
            {
                if (entity.EntityState != EntityState.Added)
                    continue;

                entity.AcceptChanges();
            }
        }
        /// <summary>
        /// Gets a page of rows from the DataSource.
        /// </summary>
        /// <param name="start">Row number at which to start reading.</param>
        /// <param name="pageLength">Number of rows to return.</param>
        /// <param name="count">Number of rows in the DataSource.</param>
        /// <param name="whereClause">Specifies the condition for the rows returned by a query (Name='John Doe', Name='John Doe' AND Id='1', Name='John Doe' OR Id='1').</param>
        /// <param name="orderBy">Specifies the sort criteria for the rows in the DataSource (Name ASC; BirthDay DESC, Name ASC);</param>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <remarks></remarks>
        /// <returns>Returns a typed collection of Library.BLL.BookImage objects.</returns>
        public override TList<BookImage> GetPaged(TransactionManager transactionManager, string whereClause, string orderBy, int start, int pageLength, out int count)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_GetPaged", _useStoredProcedure);

            if (commandWrapper.CommandType == CommandType.Text
                && commandWrapper.CommandText != null)
            {
                commandWrapper.CommandText = commandWrapper.CommandText.Replace(SqlUtil.PAGE_INDEX, string.Concat(SqlUtil.PAGE_INDEX, Guid.NewGuid().ToString("N").Substring(0, 8)));
            }

            database.AddInParameter(commandWrapper, "@WhereClause", DbType.String, whereClause);
            database.AddInParameter(commandWrapper, "@OrderBy", DbType.String, orderBy);
            database.AddInParameter(commandWrapper, "@PageIndex", DbType.Int32, start);
            database.AddInParameter(commandWrapper, "@PageSize", DbType.Int32, pageLength);

            IDataReader reader = null;
            //Create Collection
            TList<BookImage> rows = new TList<BookImage>();

            try
            {
                //Provider Data Requesting Command Event
                OnDataRequesting(new CommandEventArgs(commandWrapper, "GetPaged", rows));

                if (transactionManager != null)
                {
                    reader = Utility.ExecuteReader(transactionManager, commandWrapper);
                }
                else
                {
                    reader = Utility.ExecuteReader(database, commandWrapper);
                }

                Fill(reader, rows, 0, int.MaxValue);
                count = rows.Count;

                if(reader.NextResult())
                {
                    if(reader.Read())
                    {
                        count = reader.GetInt32(0);
                    }
                }

                //Provider Data Requested Command Event
                OnDataRequested(new CommandEventArgs(commandWrapper, "GetPaged", rows));

            }
            catch(Exception)
            {
                throw;
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                commandWrapper = null;
            }

            return rows;
        }
        /// <summary>
        /// 	Returns rows meeting the whereClause condition from the DataSource.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="whereClause">Specifies the condition for the rows returned by a query (Name='John Doe', Name='John Doe' AND Id='1', Name='John Doe' OR Id='1').</param>
        /// <param name="start">Row number at which to start reading.</param>
        /// <param name="pageLength">Number of rows to return.</param>
        /// <param name="count">out. The number of rows that match this query.</param>
        /// <remarks>Operators must be capitalized (OR, AND).</remarks>
        /// <returns>Returns a typed collection of Library.BLL.Employee objects.</returns>
        public override TList<Employee> Find(TransactionManager transactionManager, string whereClause, int start, int pageLength, out int count)
        {
            count = -1;
            if (whereClause.IndexOf(";") > -1)
                return new TList<Employee>();

            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.Employee_Find", _useStoredProcedure);

            bool searchUsingOR = false;
            if (whereClause.IndexOf(" OR ") > 0) // did they want to do "a=b OR c=d OR..."?
            searchUsingOR = true;

            database.AddInParameter(commandWrapper, "@SearchUsingOR", DbType.Boolean, searchUsingOR);

            database.AddInParameter(commandWrapper, "@ID", DbType.Int32, DBNull.Value);
            database.AddInParameter(commandWrapper, "@UserName", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Password", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Last_Login", DbType.DateTime, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Last_Logout", DbType.DateTime, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Is_Online", DbType.Boolean, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Is_Active", DbType.Boolean, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Is_Admin", DbType.Boolean, DBNull.Value);
            database.AddInParameter(commandWrapper, "@First_Name", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Last_Name", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Email", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Country", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@City", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Address", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Mobile", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Phone", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Postion", DbType.String, DBNull.Value);
            database.AddInParameter(commandWrapper, "@Is_Deleted", DbType.Boolean, DBNull.Value);
            database.AddInParameter(commandWrapper, "@CreatedOn", DbType.DateTime, DBNull.Value);
            database.AddInParameter(commandWrapper, "@CreatedBy", DbType.Int32, DBNull.Value);
            database.AddInParameter(commandWrapper, "@UpdatedOn", DbType.DateTime, DBNull.Value);
            database.AddInParameter(commandWrapper, "@UpdatedBy", DbType.Int32, DBNull.Value);
            database.AddInParameter(commandWrapper, "@DeletedOn", DbType.DateTime, DBNull.Value);
            database.AddInParameter(commandWrapper, "@DeletedBy", DbType.Int32, DBNull.Value);

            // replace all instances of 'AND' and 'OR' because we already set searchUsingOR
            whereClause = whereClause.Replace(" AND ", "|").Replace(" OR ", "|") ;
            string[] clauses = whereClause.ToLower().Split('|');

            // Here's what's going on below: Find a field, then to get the value we
            // drop the field name from the front, trim spaces, drop the '=' sign,
            // trim more spaces, and drop any outer single quotes.
            // Now handles the case when two fields start off the same way - like "Friendly='Yes' AND Friend='john'"

            char[] equalSign = {'='};
            char[] singleQuote = {'\''};
               		foreach (string clause in clauses)
            {
                if (clause.Trim().StartsWith("id ") || clause.Trim().StartsWith("id="))
                {
                    database.SetParameterValue(commandWrapper, "@ID",
                        clause.Trim().Remove(0,2).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("username ") || clause.Trim().StartsWith("username="******"@UserName",
                        clause.Trim().Remove(0,8).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("password ") || clause.Trim().StartsWith("password="******"@Password",
                        clause.Trim().Remove(0,8).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("last_login ") || clause.Trim().StartsWith("last_login="******"@Last_Login",
                        clause.Trim().Remove(0,10).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("last_logout ") || clause.Trim().StartsWith("last_logout="))
                {
                    database.SetParameterValue(commandWrapper, "@Last_Logout",
                        clause.Trim().Remove(0,11).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("is_online ") || clause.Trim().StartsWith("is_online="))
                {
                    database.SetParameterValue(commandWrapper, "@Is_Online",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("is_active ") || clause.Trim().StartsWith("is_active="))
                {
                    database.SetParameterValue(commandWrapper, "@Is_Active",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("is_admin ") || clause.Trim().StartsWith("is_admin="))
                {
                    database.SetParameterValue(commandWrapper, "@Is_Admin",
                        clause.Trim().Remove(0,8).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("first_name ") || clause.Trim().StartsWith("first_name="))
                {
                    database.SetParameterValue(commandWrapper, "@First_Name",
                        clause.Trim().Remove(0,10).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("last_name ") || clause.Trim().StartsWith("last_name="))
                {
                    database.SetParameterValue(commandWrapper, "@Last_Name",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("email ") || clause.Trim().StartsWith("email="))
                {
                    database.SetParameterValue(commandWrapper, "@Email",
                        clause.Trim().Remove(0,5).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("country ") || clause.Trim().StartsWith("country="))
                {
                    database.SetParameterValue(commandWrapper, "@Country",
                        clause.Trim().Remove(0,7).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("city ") || clause.Trim().StartsWith("city="))
                {
                    database.SetParameterValue(commandWrapper, "@City",
                        clause.Trim().Remove(0,4).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("address ") || clause.Trim().StartsWith("address="))
                {
                    database.SetParameterValue(commandWrapper, "@Address",
                        clause.Trim().Remove(0,7).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("mobile ") || clause.Trim().StartsWith("mobile="))
                {
                    database.SetParameterValue(commandWrapper, "@Mobile",
                        clause.Trim().Remove(0,6).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("phone ") || clause.Trim().StartsWith("phone="))
                {
                    database.SetParameterValue(commandWrapper, "@Phone",
                        clause.Trim().Remove(0,5).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("postion ") || clause.Trim().StartsWith("postion="))
                {
                    database.SetParameterValue(commandWrapper, "@Postion",
                        clause.Trim().Remove(0,7).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("is_deleted ") || clause.Trim().StartsWith("is_deleted="))
                {
                    database.SetParameterValue(commandWrapper, "@Is_Deleted",
                        clause.Trim().Remove(0,10).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("createdon ") || clause.Trim().StartsWith("createdon="))
                {
                    database.SetParameterValue(commandWrapper, "@CreatedOn",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("createdby ") || clause.Trim().StartsWith("createdby="))
                {
                    database.SetParameterValue(commandWrapper, "@CreatedBy",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("updatedon ") || clause.Trim().StartsWith("updatedon="))
                {
                    database.SetParameterValue(commandWrapper, "@UpdatedOn",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("updatedby ") || clause.Trim().StartsWith("updatedby="))
                {
                    database.SetParameterValue(commandWrapper, "@UpdatedBy",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("deletedon ") || clause.Trim().StartsWith("deletedon="))
                {
                    database.SetParameterValue(commandWrapper, "@DeletedOn",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }
                if (clause.Trim().StartsWith("deletedby ") || clause.Trim().StartsWith("deletedby="))
                {
                    database.SetParameterValue(commandWrapper, "@DeletedBy",
                        clause.Trim().Remove(0,9).Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
                    continue;
                }

                throw new ArgumentException("Unable to use this part of the where clause in this version of Find: " + clause);
            }

            IDataReader reader = null;
            //Create Collection
            TList<Employee> rows = new TList<Employee>();

            try
            {
                //Provider Data Requesting Command Event
                OnDataRequesting(new CommandEventArgs(commandWrapper, "Find", rows));

                if (transactionManager != null)
                {
                    reader = Utility.ExecuteReader(transactionManager, commandWrapper);
                }
                else
                {
                    reader = Utility.ExecuteReader(database, commandWrapper);
                }

                Fill(reader, rows, start, pageLength);

                if(reader.NextResult())
                {
                    if(reader.Read())
                    {
                        count = reader.GetInt32(0);
                    }
                }

                //Provider Data Requested Command Event
                OnDataRequested(new CommandEventArgs(commandWrapper, "Find", rows));
            }
            finally
            {
                if (reader != null)
                    reader.Close();

                commandWrapper = null;
            }
            return rows;
        }
        /// <summary>
        /// 	Update an existing row in the datasource.
        /// </summary>
        /// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
        /// <param name="entity">Library.BLL.BookImage object to update.</param>
        /// <remarks>
        ///		After updating the datasource, the Library.BLL.BookImage object will be updated
        /// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
        /// </remarks>
        /// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
        public override bool Update(TransactionManager transactionManager, Library.BLL.BookImage entity)
        {
            SqlDatabase database = new SqlDatabase(this._connectionString);
            DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.BookImage_Update", _useStoredProcedure);

            database.AddInParameter(commandWrapper, "@ID", DbType.Int32, entity.ID );
            database.AddInParameter(commandWrapper, "@Name", DbType.String, entity.Name );
            database.AddInParameter(commandWrapper, "@Format", DbType.String, entity.Format );
            database.AddInParameter(commandWrapper, "@Size", DbType.String, entity.Size );
            database.AddInParameter(commandWrapper, "@Link", DbType.String, entity.Link );
            database.AddInParameter(commandWrapper, "@IsAvailable", DbType.String, entity.IsAvailable );

            int results = 0;

            //Provider Data Requesting Command Event
            OnDataRequesting(new CommandEventArgs(commandWrapper, "Update", entity));

            if (transactionManager != null)
            {
                results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
            }
            else
            {
                results = Utility.ExecuteNonQuery(database,commandWrapper);
            }

            //Stop Tracking Now that it has been updated and persisted.
            if (DataRepository.Provider.EnableEntityTracking)
            {
                EntityManager.StopTracking(entity.EntityTrackingKey);
            }

            entity.AcceptChanges();

            //Provider Data Requested Command Event
            OnDataRequested(new CommandEventArgs(commandWrapper, "Update", entity));

            return Convert.ToBoolean(results);
        }
 /// <summary>
 /// Executes the non query.
 /// </summary>
 /// <param name="transactionManager">The transaction manager.</param>
 /// <param name="storedProcedureName">Name of the stored procedure.</param>
 /// <param name="parameterValues">The parameter values.</param>
 /// <returns></returns>
 public override int ExecuteNonQuery(TransactionManager transactionManager, string storedProcedureName, params object[] parameterValues)
 {
     SqlDatabase database = new SqlDatabase(this._connectionString);
     return database.ExecuteNonQuery(transactionManager.TransactionObject, storedProcedureName, parameterValues);
 }