In this article we will focus on accessing data only using Stored Procedure using Entity Framework.
At first we need to create a database named CRUD_Sample. In sample db we have to create a table named Customer.
USE [CRUD_Sample] GO /****** Object: Table [dbo].[Customers] Script Date: 1/23/2016 10:02:11 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Customers]( [Id] [bigint] NOT NULL, [CustName] [varchar](100) NULL, [CustEmail] [varchar](150) NULL, CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
Store Procuders:
USE [CRUD_Sample] GO /****** Object: StoredProcedure [dbo].[Delete_Customer] Script Date: 1/23/2016 10:01:09 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author:-- Create date: -- Description: -- ============================================= CREATE PROCEDURE [dbo].[Delete_Customer] -- Add the parameters for the stored procedure here @Id Bigint AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here DELETE FROM[dbo].[Customers] WHERE [Id] = @Id SELECT 1 END GO /****** Object: StoredProcedure [dbo].[Get_Customer] Script Date: 1/23/2016 10:01:09 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= CREATE PROCEDURE [dbo].[Get_Customer] -- Add the parameters for the stored procedure here BIGINT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT top* FROM [dbo].[Customers] END GO /****** Object: StoredProcedure [dbo].[Get_CustomerbyID] Script Date: 1/23/2016 10:01:09 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= CREATE PROCEDURE [dbo].[Get_CustomerbyID] -- Add the parameters for the stored procedure here @Id BIGINT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT * FROM [dbo].[Customers] WHERE Id=@Id END GO /****** Object: StoredProcedure [dbo].[Set_Customer] Script Date: 1/23/2016 10:01:09 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= CREATE PROCEDURE [dbo].[Set_Customer] -- Add the parameters for the stored procedure here Nvarchar(100) , Nvarchar(150) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @Id bigint SET @Id = ISNULL(((SELECT MAX(Id) FROM [Customers])+1),'1') -- Insert statements for procedure here INSERT INTO [dbo].[Customers] ([Id],[CustName],[CustEmail]) VALUES(@Id,,) SELECT 1 END GO /****** Object: StoredProcedure [dbo].[Update_Customer] Script Date: 1/23/2016 10:01:09 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= CREATE PROCEDURE [dbo].[Update_Customer] -- Add the parameters for the stored procedure here @Id Bigint , Nvarchar(100) , Nvarchar(150) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here UPDATE [dbo].[Customers] SET[CustName] = ,[CustEmail]= WHERE [Id] = @Id SELECT 1 END GO
Repository Pattern:
The Repository Pattern allows to centralise all data access logic in one place.
It is a common construct to avoid duplication of data access logic throughout our application.
The Repository pattern adds a separation layer between the data and business layers of an application.
Generic Repository Pattern:
With generic feature, we can reduce the amount of code we need for common scenarios.
namespace WebApplication1.Repository { interface IRepository: IDisposable where T : class { IEnumerable ExecuteQuery(string spQuery, object[] parameters); T ExecuteQuerySingle(string spQuery, object[] parameters); int ExecuteCommand(string spQuery, object[] parameters); } }
interface IRepository
Show an interface of a generic repository of type T, which is a LINQ to SQL entity. It provides a basic interface with operations like Insert, Update, Delete, GetById and GetAll.
IDisposable
The IDisposable Interface, Provides a mechanism for releasing unmanaged resources.
where T : class
This is constraining the generic parameter to a class.
The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.
namespace WebApplication1.Repository { public class GenericRepository: IRepository where T : class { Customer_Entities context = null; private DbSet entities = null; public GenericRepository(Customer_Entities context) { this.context = context; entities = context.Set (); } /// /// Get Data From Database /// public IEnumerableUse it when to retive data through a stored procedure ///ExecuteQuery(string spQuery, object[] parameters) { using (context = new Customer_Entities()) { return context.Database.SqlQuery (spQuery, parameters).ToList(); } } /// /// Get Single Data From Database /// public T ExecuteQuerySingle(string spQuery, object[] parameters) { using (context = new Customer_Entities()) { return context.Database.SqlQueryUse it when to retive single data through a stored procedure ///(spQuery, parameters).FirstOrDefault(); } } /// /// Insert/Update/Delete Data To Database /// public int ExecuteCommand(string spQuery, object[] parameters) { int result = 0; try { using (context = new Customer_Entities()) { result = context.Database.SqlQueryUse it when to Insert/Update/Delete data through a stored procedure ///(spQuery, parameters).FirstOrDefault(); } } catch { } return result; } private bool disposed = false; protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { context.Dispose(); } } this.disposed = true; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } }
Use of Middle-tire:
namespace WebApplication1.Services { public partial class CustomerService { private GenericRepositoryCustRepository; //CustomerRepository CustRepository; public CustomerService() { this.CustRepository = new GenericRepository (new Customer_Entities()); } public IEnumerable GetAll(object[] parameters) { string spQuery = "[Get_Customer] {0}"; return CustRepository.ExecuteQuery(spQuery, parameters); } public Customer GetbyID(object[] parameters) { string spQuery = "[Get_CustomerbyID] {0}"; return CustRepository.ExecuteQuerySingle(spQuery, parameters); } public int Insert(object[] parameters) { string spQuery = "[Set_Customer] {0}, {1}"; return CustRepository.ExecuteCommand(spQuery, parameters); } public int Update(object[] parameters) { string spQuery = "[Update_Customer] {0}, {1}, {2}"; return CustRepository.ExecuteCommand(spQuery, parameters); } public int Delete(object[] parameters) { string spQuery = "[Delete_Customer] {0}"; return CustRepository.ExecuteCommand(spQuery, parameters); } } }
Use of Generic Repository in MVC-Application:
namespace WebApplication1.Controllers { public class HomeController : Controller { private CustomerService objCust; //CustomerRepository CustRepository; public HomeController() { this.objCust = new CustomerService(); } // GET: Home public ActionResult Index() { int Count = 10; object[] parameters = { Count }; var test = objCust.GetAll(parameters); return View(test); } public ActionResult Insert() { return View(); } [HttpPost] public ActionResult Insert(Customer model) { if (ModelState.IsValid) { object[] parameters = { model.CustName, model.CustEmail }; objCust.Insert(parameters); } return RedirectToAction("Index"); } public ActionResult Delete(int id) { object[] parameters = { id }; this.objCust.Delete(parameters); return RedirectToAction("Index"); } public ActionResult Update(int id) { object[] parameters = { id }; return View(this.objCust.GetbyID(parameters)); } [HttpPost] public ActionResult Update(Customer model) { object[] parameters = { model.Id, model.CustName, model.CustEmail }; objCust.Update(parameters); return RedirectToAction("Index"); } protected override void Dispose(bool disposing) { base.Dispose(disposing); } } }
Source Code: I’ve uploaded the full source code to download/clone , Hope this will help 🙂
priya says:
I am new to asp.net mvc in this , u didnt mention the connection string of database.not required?
rakesh says:
Hi Priya,
Here using entity data model, model name Customer_Entities. entity data model have a connection string
ruchi says:
i am new in mvc , could u please tell me how i teach mvc with angular js very well.I wants ur all articles
Valter says:
Thank you so much for share your knowledge!
satyesh says:
Best articles
says:
Can I have code sample for above please ?
Shashangka Shekhar says:
Giancarlo Perez says:
thanks for comming back ,a saved in my markups your page and it was offline
rajneesh says:
Actully i referred that code but i get on e exception i.e dbcontext is not disposed