Showing posts with label Generic Repository. Show all posts
Showing posts with label Generic Repository. Show all posts

Tuesday, August 28, 2018

Part 61 - Download and Setup Complete Repository Pattern Project ( Asp.net MVC)



Hey guys, hope you have learned a lot of things from this tutorial series. So, I have decided to provide you complete project for no price. Yes you have heard it right. This project has lots of  features included. Here are the list of the things that you can get to learn from this project


  1. Multilayered Architecture
  2. Repository Pattern
  3. Dependency Injection using unity.mvc5
  4. Use of Jquery DataTable
  5. Use of Bootstrap 
  6. CRUD operations 
  7. Use of Partial Views 
  8. Use of Automapper
  9. Use of Entity framework 
  10. Use of ViewModels and DomainModels

You can visit below links to learn how to create multilayered architecture.

1.  Business Layer 
2. Domain Layer 
3. Data Access Layer 


Here are the steps to download and setup the project 


Step 1: Download the project zip file Here


step 2: After extracting the zip file, you will get two files. (a) Project solution file and (b) Database script 



step 3: Create a database with name MVCTutorial 
step 4: Execute "MVCTutorial Database script" in SQL server. You can also get the same from  zip file. 
Step 5 :  Update the data source in your connection string in App.config file (MVCTutorial.Repository) and Web.config file (MVCTutorial Web Layer)

Currently, In below connection string, you will see data source=HP-PC\SQLSERVER2014;  , Just update it to your local system data source. 


<connectionStrings>
    <add name="MVCTutorialEntitiesContainer" connectionString="metadata=res://*/MVCTutorialEntities.csdl|res://*/MVCTutorialEntities.ssdl|res://*/MVCTutorialEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HP-PC\SQLSERVER2014;initial catalog=MVCTutorial;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
 


Step 6: Run your project 
Step 7: You are done 

For complete demonstration, please watch above video 


All Code Factory


What Next => Nothing...You have everything to learn. Haven't  it?

Please Like, Share and subscribe our Channel. Have a great day.

Part 60 - Add Edit Record using Repository Pattern - CRUD




In this tutorial, You will learn about how to perform CRUD operation(Create & Update) over generic repository 

So far, we were creating several Layers but now we will see how the actual repository get setup so that we can use its predefined methods without doing any change into this. In other words, making repository more generic. 

Lets have a quick review of all layers that we created in previous tutorial.

1. Web Layer is your MVC web Project
2.  Business Layer consist the CRUD operation, gets data from Data Access Layer, Manipulate them and finally returns data to the Controller ( Web Layer)
3. Domain Layer consist the Domain Models or Classes that hold the data coming from Data Access Layer. Both Web and Business Layer can use domain models to exchange data.
4. Data Access Layer consist the generic repository methods (generic CRUD operation), Unit of Work( Database Context) and NON Generic repository( User defined repository).





Step 1: Please watch Part 58 (Setup generic repository) before moving to step 2Step 2 : Add EmployeeRepository class into your Repository Layer (MVCTutorial.Repository) and use below code 

A.  EmployeeRepository .cs 

using MVCTutorial.Repository.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVCTutorial.Repository
{
    public class EmployeeRepository:BaseRepository<Employee>
    {
        public EmployeeRepository(IUnitOfWork unitOfWork) : base(unitOfWork) { }

    }
}




Step 2 : In EmployeeBusiness.cs (MVCTutorial.Business layer) class use below code 

B.  EmployeeBusiness.cs 

using MVCTutorial.Business.Interface;
using MVCTutorial.Domain;
using MVCTutorial.Repository;
using MVCTutorial.Repository.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVCTutorial.Business
{
    public class EmployeeBusiness : IEmployeeBusiness
    {
        private readonly IUnitOfWork unitOfWork;
        private readonly EmployeeRepository empRepository;

        public EmployeeBusiness(IUnitOfWork _unitOfWork)
        {

            unitOfWork = _unitOfWork;
            empRepository = new EmployeeRepository(unitOfWork);
        }
             

        #region

      
        public string AddUpdateEmployee(EmployeeDomainModel empModel)
        {

            string result = "";
            if (empModel.EmployeeId > 0)
            {

                Employee emp = empRepository.SingleOrDefault(x => x.EmployeeId == empModel.EmployeeId);

                if (emp != null)
                {
                    emp.Name = empModel.Name;
                    emp.DepartmentId = empModel.DepartmentId;
                    emp.Address = empModel.Address;

                    empRepository.Update(emp);

                    result = "updated";

                }
            }
            else
            {
                Employee emp = new Employee();

                emp.Name = empModel.Name;
                emp.DepartmentId = empModel.DepartmentId;
                emp.Address = empModel.Address;
                emp.IsDeleted = false;

                var record = empRepository.Insert(emp);

                result = "Inserted";
            }

            return result;
        }

        #endregion

    }
}


Step 4 : Call this method from your controller with appropriate data. 
Step 5 : You are done

What Next => Nothing...You have learned a lot. Are not you?

Please Like, Share and subscribe our Channel. Have a great day.


All Code Factory



Part 59 - Display Record using repository pattern - CRUD


In this tutorial, You will learn about how to perform CRUD operation(Read) over generic repository 

So far, we were creating several Layers but now we will see how the actual repository get setup so that we can use its predefined methods without doing any change into this. In other words, making repository more generic. 

Lets have a quick review of all layers that we created in previous tutorial.

1. Web Layer is your MVC web Project
2.  Business Layer consist the CRUD operation, gets data from Data Access Layer, Manipulate them and finally returns data to the Controller ( Web Layer)
3. Domain Layer consist the Domain Models or Classes that hold the data coming from Data Access Layer. Both Web and Business Layer can use domain models to exchange data.
4. Data Access Layer consist the generic repository methods (generic CRUD operation), Unit of Work( Database Context) and NON Generic repository( User defined repository).





Step 1: Please watch Part 58 (Setup generic repository) before moving to step 2Step 2 : Add EmployeeRepository class into your Repository Layer (MVCTutorial.Repository) and use below code 

A.  EmployeeRepository .cs 

using MVCTutorial.Repository.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVCTutorial.Repository
{
    public class EmployeeRepository:BaseRepository<Employee>
    {
        public EmployeeRepository(IUnitOfWork unitOfWork) : base(unitOfWork) { }

    }
}




Step 2 : In EmployeeBusiness.cs (MVCTutorial.Business layer) class use below code 

B.  EmployeeBusiness.cs 

using MVCTutorial.Business.Interface;
using MVCTutorial.Domain;
using MVCTutorial.Repository;
using MVCTutorial.Repository.Infrastructure;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVCTutorial.Business
{
    public class EmployeeBusiness : IEmployeeBusiness
    {
        private readonly IUnitOfWork unitOfWork;
        private readonly EmployeeRepository empRepository;

        public EmployeeBusiness(IUnitOfWork _unitOfWork)
        {

            unitOfWork = _unitOfWork;
            empRepository = new EmployeeRepository(unitOfWork);
        }
             

        #region

        public List<EmployeeDomainModel> GetAllEmployee()
        {
            List<EmployeeDomainModel> list = empRepository.GetAll().Select(m => new EmployeeDomainModel { Name = m.Name, DepartmentName = m.Department.DepartmentName, Address = m.Address }).ToList();

            return list;
        }

        #endregion

    }
}



Step 4 : Call this method in your controller
Step 5 : You are done


What Next => In next tutorial we will learn  about how to  perform Add Edit operation   over Generic Repository

Please Like, Share and subscribe our Channel. Have a great day.


All Code Factory


Monday, May 28, 2018

Part 58 - Repository Pattern - 5 - Setting Up Generic Repository and UnitOfWork in Data Access Layer



In this tutorial, You will learn about how to Setup Generic Repository and UnitOfWork in Data Access Layer under repository pattern implementation in Asp.net MVC. 

So far, we were creating several Layers but now we will see how the actual repository get setup so that we can use its predefined methods without doing any change into this. In other words, making repository more generic. 

Lets have a quick review of all layers that we created in previous tutorial.

1. Web Layer is your MVC web Project
2.  Business Layer consist the CRUD operation, gets data from Data Access Layer, Manipulate them and finally returns data to the Controller ( Web Layer)
3. Domain Layer consist the Domain Models or Classes that hold the data coming from Data Access Layer. Both Web and Business Layer can use domain models to exchange data.
4. Data Access Layer consist the generic repository methods (generic CRUD operation), Unit of Work( Database Context) and NON Generic repository( User defined repository).




#How to Setup Generic Repository and UnitOfWork? 

 Please follow below Steps 

Step 1 : Adding  Interface and classes into Data Access Layer

 A.   Add Infrastructure Folder into Repository Layer. Inside this folder we are going to place our all Generic Repository Code.
B.  Add Contract folder into Infrastructure folder
C.  Add two interface into Contract folder i.e IBaseRepository.cs and IUnitOfWork.cs
D. Add concrete classes into Infrastructure folder i.e Add BaseRepository.cs and UnitOfWork.cs



Step 2 : Add generic code into above created files. 

A.  IBaseRepository.cs ( Interface) 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace MVCTutorial.Repository.Infrastructure
{
    public interface IBaseRepository<T>
    {
       
        /// <summary>
        /// Retrieve a single item by it's primary key or return null if not found
        /// </summary>
        /// <param name="primaryKey">Prmary key to find</param>
        /// <returns>T</returns>
        T SingleOrDefault(Expression<Func<T, bool>> whereCondition);

        /// <summary>
        /// Returns all the rows for type T
        /// </summary>
        /// <returns></returns>
        IEnumerable<T> GetAll();

        /// <summary>
        /// Returns all the rows for type T on basis of filter condition
        /// </summary>
        /// <returns></returns>
        IEnumerable<T> GetAll(Expression<Func<T, bool>> whereCondition);
               
        /// <summary>
        /// Inserts the data into the table
        /// </summary>
        /// <param name="entity">The entity to insert</param>
        /// <param name="userId">The user performing the insert</param>
        /// <returns></returns>
        T Insert(T entity);

        /// <summary>
        /// Updates this entity in the database using it's primary key
        /// </summary>
        /// <param name="entity">The entity to update</param>
        /// <param name="userId">The user performing the update</param>
        void Update(T entity);

        /// <summary>
        /// Updates all the passed entities in the database 
        /// </summary>
        /// <param name="entities">Entities to update</param>
        void UpdateAll(IList<T> entities);

        /// <summary>
        /// Deletes this entry fro the database
        /// ** WARNING - Most items should be marked inactive and Updated, not deleted
        /// </summary>
        /// <param name="entity">The entity to delete</param>
        /// <param name="userId">The user Id who deleted the entity</param>
        /// <returns></returns>
        void Delete(Expression<Func<T, bool>> whereCondition);
        
        /// <summary>
        /// Does this item exist by it's primary key
        /// </summary>
        /// <param name="primaryKey"></param>
        /// <returns></returns>
        bool Exists(Expression<Func<T, bool>> whereCondition);

    }
   
}



B.  IUnitOfWork( Interface) 

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MVCTutorial.Repository.Infrastructure
{
    public interface IUnitOfWork : IDisposable
    {
        /// <summary>
        /// Return the database reference for this UOW
        /// </summary>
        DbContext Db { get; }

    
    }
}



C. BaseRepository( Concrete Class)

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace MVCTutorial.Repository.Infrastructure
{
    /// <summary>
    /// Base class for all SQL based service classes
    /// </summary>
    /// <typeparam name="T">The domain object type</typeparam>
    /// <typeparam name="TU">The database object type</typeparam>
    public class BaseRepository<T> : IBaseRepository<T> where T : class
    {
        private readonly IUnitOfWork _unitOfWork;
        internal DbSet<T> dbSet;

        public BaseRepository(IUnitOfWork unitOfWork)
        {
            if (unitOfWork == null) throw new ArgumentNullException("unitOfWork");
            _unitOfWork = unitOfWork;
            this.dbSet = _unitOfWork.Db.Set<T>();
        }

        public T SingleOrDefault(Expression<Func<T, bool>> whereCondition)
        {
            var dbResult = dbSet.Where(whereCondition).FirstOrDefault();
            return dbResult;
        }
              
        public IEnumerable<T> GetAll()
        {
            return dbSet.AsEnumerable();
        }

        public IEnumerable<T> GetAll(Expression<Func<T, bool>> whereCondition)
        {
            return dbSet.Where(whereCondition).AsEnumerable();
        }

        public virtual T Insert(T entity)
        {

            dynamic obj = dbSet.Add(entity);
            this._unitOfWork.Db.SaveChanges();
            return obj;

        }

        public virtual void Update(T entity)
        {
            dbSet.Attach(entity);
            _unitOfWork.Db.Entry(entity).State = EntityState.Modified;
            this._unitOfWork.Db.SaveChanges();


        }

        public virtual void UpdateAll(IList<T> entities)
        {
            foreach (var entity in entities)
            {
                dbSet.Attach(entity);
                _unitOfWork.Db.Entry(entity).State = EntityState.Modified;
            }
            this._unitOfWork.Db.SaveChanges();
        }

        public void Delete(Expression<Func<T, bool>> whereCondition)
        {
            IEnumerable<T> entities = this.GetAll(whereCondition);
            foreach (T entity in entities)
            {
                if (_unitOfWork.Db.Entry(entity).State == EntityState.Detached)
                {
                    dbSet.Attach(entity);
                }
                dbSet.Remove(entity);
            }
            this._unitOfWork.Db.SaveChanges();
        }

        //--------------Exra generic methods--------------------------------

        public T SingleOrDefaultOrderBy(Expression<Func<T, bool>> whereCondition, Expression<Func<T, int>> orderBy, string direction)
        {
            if (direction == "ASC")
            {
                return dbSet.Where(whereCondition).OrderBy(orderBy).FirstOrDefault();

            }
            else
            {
                return dbSet.Where(whereCondition).OrderByDescending(orderBy).FirstOrDefault();
            }
        }

        public bool Exists(Expression<Func<T, bool>> whereCondition)
        {
            return dbSet.Any(whereCondition);
        }

        public int Count(Expression<Func<T, bool>> whereCondition)
        {
            return dbSet.Where(whereCondition).Count();
        }

        public IEnumerable<T> GetPagedRecords(Expression<Func<T, bool>> whereCondition, Expression<Func<T, string>> orderBy, int pageNo, int pageSize)
        {
            return (dbSet.Where(whereCondition).OrderBy(orderBy).Skip((pageNo - 1) * pageSize).Take(pageSize)).AsEnumerable();
        }

        public IEnumerable<T> ExecWithStoreProcedure(string query, params object[] parameters)
        {
            return dbSet.SqlQuery(query, parameters);
        }
    }
}



D. UnitOfWork( Concrete Class)  :  

Note: In below code MVCTutorialEntitiesContainer is db context/ Connection string name. You can copy the name from App.config File. 

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MVCTutorial.Repository.Infrastructure
{
    public class UnitOfWork : IUnitOfWork
    {
        private readonly MVCTutorialEntitiesContainer _dbContext;

        public UnitOfWork()
        {
            _dbContext = new MVCTutorialEntitiesContainer();
        }

        public DbContext Db
        {
            get { return _dbContext; }
        }

        public void Dispose()
        {
        }
    }

}



What Next => In next tutorial we will learn  about how to  create Non Generic  Repository against each entity or database class. We will also learn how to perform CRUD operation over Generic Repository

Please Like, Share and subscribe our Channel. Have a great day.


All Code Factory