In this topic we will focus on how to display real time updates from databases with SignalR on existing ASP.NET MVC CRUD project.
The topic has the following two steps:
- In the first step we will create a sample app to perform CRUD operations.
- In the second step we will make the app real-time with SignalR.
Those who are not familiar with SignalR, visit my previous article on Overview of SignalR.
Step 1: At first we need to create a database named CRUD_Sample. In sample db we have to create a table named Customers.
- CREATE TABLE [dbo].[Customers](
- [Id] [bigint] IDENTITY(1,1) 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
- USE [CRUD_Sample]
- GO
- /****** Object: StoredProcedure [dbo].[Delete_Customer] Script Date: 12/27/2015 1:44:05 PM ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: <Author,,Name>
- -- Create date: <Create Date,,>
- -- Description: <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: 12/27/2015 1:44:05 PM ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: <Author,,Name>
- -- Create date: <Create Date,,>
- -- Description: <Description,,>
- -- =============================================
- CREATE PROCEDURE [dbo].[Get_Customer]
- -- Add the parameters for the stored procedure here
- @Count INT
- 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(@Count)* FROM [dbo].[Customers]
- END
- GO
- /****** Object: StoredProcedure [dbo].[Get_CustomerbyID] Script Date: 12/27/2015 1:44:05 PM ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: <Author,,Name>
- -- Create date: <Create Date,,>
- -- Description: <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: 12/27/2015 1:44:05 PM ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: <Author,,Name>
- -- Create date: <Create Date,,>
- -- Description: <Description,,>
- -- =============================================
- CREATE PROCEDURE [dbo].[Set_Customer]
- -- Add the parameters for the stored procedure here
- @CustName Nvarchar(100)
- ,@CustEmail 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
- INSERT INTO [dbo].[Customers]([CustName],[CustEmail])
- VALUES(@CustName,@CustEmail)
- SELECT 1
- END
- GO
- /****** Object: StoredProcedure [dbo].[Update_Customer] Script Date: 12/27/2015 1:44:05 PM ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- -- =============================================
- -- Author: <Author,,Name>
- -- Create date: <Create Date,,>
- -- Description: <Description,,>
- -- =============================================
- CREATE PROCEDURE [dbo].[Update_Customer]
- -- Add the parameters for the stored procedure here
- @Id Bigint
- ,@CustNameNvarchar(100)
- ,@CustEmailNvarchar(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] = @CustName,[CustEmail]= @CustEmail
- WHERE [Id] = @Id
- SELECT 1
- END
- GO
To create a sample application, we need to have Visual Studio 2012 or later installed and be able to run the server on a platform that supports .NET 4.5.
Step 1:
Step 2:

Step 3:

Click OK and Visual Studio will create and load a new ASP.NET application project.
Use of Generic Repository
With a generic feature, we can reduce the amount of code we need for common scenarios.
- namespace WebApplication1.Repository
- {
- interfaceIRepository < T > : IDisposablewhereT: class
- {
- IEnumerable < T > ExecuteQuery(stringspQuery, object[] parameters);
- TExecuteQuerySingle(stringspQuery, object[] parameters);
- intExecuteCommand(stringspQuery, object[] parameters);
- }
- }
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.
whereT : class
This is constraining the generic parameter to a class. Click for more.
The type of argument must be a reference type; this applies also to any class, interface, delegate, or array type.
- namespace WebApplication1.Repository
- {
- public class GenericRepository < T > : IRepository < T > whereT: class
- {
- Customer_Entities context = null;
- privateDbSet < T > entities = null;
- public GenericRepository(Customer_Entities context)
- {
- this.context = context;
- entities = context.Set < T > ();
- }
- ///<summary>
- /// Get Data From Database
- ///<para>Use it when to retive data through a stored procedure</para>
- ///</summary>
- public IEnumerable < T > ExecuteQuery(stringspQuery, object[] parameters)
- {
- using(context = newCustomer_Entities())
- {
- returncontext.Database.SqlQuery < T > (spQuery, parameters).ToList();
- }
- }
- ///<summary>
- /// Get Single Data From Database
- ///<para>Use it when to retive single data through a stored procedure</para>
- ///</summary>
- public TExecuteQuerySingle(stringspQuery, object[] parameters)
- {
- using(context = newCustomer_Entities())
- {
- returncontext.Database.SqlQuery < T > (spQuery, parameters).FirstOrDefault();
- }
- }
- ///<summary>
- /// Insert/Update/Delete Data To Database
- ///<para>Use it when to Insert/Update/Delete data through a stored procedure</para>
- ///</summary>
- public intExecuteCommand(stringspQuery, object[] parameters)
- {
- int result = 0;
- try
- {
- using(context = newCustomer_Entities())
- {
- result = context.Database.SqlQuery < int > (spQuery, parameters).FirstOrDefault();
- }
- }
- catch
- {}
- return result;
- }
- private bool disposed = false;
- protected virtualvoid Dispose(bool disposing)
- {
- if (!this.disposed)
- {
- if (disposing)
- {
- context.Dispose();
- }
- }
- this.disposed = true;
- }
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
- }
- }
- namespace WebApplication1.Services
- {
- public partial class CustomerService
- {
- privateGenericRepository < Customer > CustRepository;
- //CustomerRepositoryCustRepository;
- public CustomerService()
- {
- this.CustRepository = newGenericRepository < Customer > (newCustomer_Entities());
- }
- public IEnumerable < Customer > GetAll(object[] parameters)
- {
- stringspQuery = "[Get_Customer] {0}";
- returnCustRepository.ExecuteQuery(spQuery, parameters);
- }
- public CustomerGetbyID(object[] parameters)
- {
- stringspQuery = "[Get_CustomerbyID] {0}";
- returnCustRepository.ExecuteQuerySingle(spQuery, parameters);
- }
- public int Insert(object[] parameters)
- {
- stringspQuery = "[Set_Customer] {0}, {1}";
- returnCustRepository.ExecuteCommand(spQuery, parameters);
- }
- public int Update(object[] parameters)
- {
- stringspQuery = "[Update_Customer] {0}, {1}, {2}";
- returnCustRepository.ExecuteCommand(spQuery, parameters);
- }
- public int Delete(object[] parameters)
- {
- stringspQuery = "[Delete_Customer] {0}";
- returnCustRepository.ExecuteCommand(spQuery, parameters);
- }
- }
- }


inco bilgisayarPosted Feb 27, 2020, 4:38 AM
how can we do same sample in Separate Layers as UI-API-Domain (dbentities and services)
Shamim UddinPosted Oct 2, 2016, 1:27 AM
Nice
Manav PandyaPosted Sep 21, 2016, 12:35 PM
Nice sir ...
Ntiyiso MbhalatiPosted Jul 20, 2016, 4:06 AM
I'm unable to download the solution, was it moved?
Sridhar SharmaPosted Mar 10, 2016, 9:58 PM
Nice Share
Anu VPosted Feb 4, 2016, 5:25 AM
Nice
Ankur MistryPosted Jan 27, 2016, 3:19 PM
Really nice share
Arul RPosted Jan 26, 2016, 10:34 PM
Nice share
sreenivasa kPosted Jan 26, 2016, 2:56 PM
excellent
Gowtham KPosted Jan 18, 2016, 10:47 AM
Good One, Thanks for sharing:)
Mohammed IbrahimPosted Jan 18, 2016, 8:59 AM
nice
Raja TPosted Jan 18, 2016, 7:03 AM
Nice,Thanks for sharing
Debasis SahaPosted Jan 18, 2016, 4:08 AM
Nice One..
Ankit BansalPosted Jan 18, 2016, 12:30 AM
Really helpful..
Sabyasachi MishraPosted Jan 17, 2016, 11:51 PM
Good one
Muhammad Aqib ShehzadPosted Jan 17, 2016, 1:55 PM
very nice and detailed article, thanks for sharing.
Santhakumar MunuswamyPosted Jan 13, 2016, 10:18 AM
Thanks for nice article
Muhammad Aqib ShehzadPosted Jan 12, 2016, 9:32 AM
good sharing.....
Humayun Kabir MamunPosted Jan 11, 2016, 11:01 PM
Nice...
Raja TPosted Jan 11, 2016, 10:41 PM
Nice,thanks for sharing
Ehsan SajjadPosted Jan 11, 2016, 1:28 PM
That's good, at least some one used other example than Chat application