


Let’s Start
Step – 1
Open Visual Studio and click on Create New Project

Step – 2
Select ASP.NET Core Web App (Model-View-Controller) – [C# ] and click next button

Step – 3
Enter the project name and click on next button

Step – 4
Select .Net 6.0 , authentication type None and click on create button

Once created, your project will look like following

Step – 5
Open Models folder and create a Employee class
Enter the following code in the employee class
using System.ComponentModel.DataAnnotations;
namespace EmployeeCRUD.Models
{
public class Employee
{
[Key]
public int Id { get; set; }
[Required]
[Display(Name ="Employee Name")]
public string Name { get; set; }
public string Designation { get; set; }
[DataType(DataType.MultilineText)]
public string Address { get; set; }
public DateTime? RecordCreatedOn { get; set; }
}
}
Step – 6
Install the following packages according to your .NET Core version
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.1">
Step – 7
Create a subclass ApplicationDbContext of DBContext Class
to link the database with data model class
- Create one folder and name it Data

- Create ApplicaitonDbContext class and enter the following code
using EmployeeCRUD.Models;
using Microsoft.EntityFrameworkCore;
namespace EmployeeCRUD.Data
{
public class ApplicationDbContext:DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options):base(options)
{
}
public DbSet<Employee> Employees { get; set; }
}
}
In the above code we are passing parameter DbContextOptions<ApplicationDbContext> using constructor, Using this we are passing context configuration from AddDbContext to DbContext
Step – 8
Open appsettings.json and configure the connection string
The following code of appsettings.json file is with sample data. Replace the sample data as per your system or development environment settings.
{
"ConnectionStrings": {
"DefaultConnection": "Server=EnterServerName; Database=EmployeeDatabase; User Id=sa; Password=EnterPassword; Trusted_Connection=True; MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Step – 9
Open the program.cs file and add the required services
- Register ApplicationDbContext subclass as scoped service in application service provider / dependency injection container.
- Enter the following lines of code to register the ApplicaitonDbContext
// add
builder.Services.AddDbContext<ApplicationDbContext>(
options => options.UseSqlServer(
builder.Configuration.GetConnectionString("DefaultConnection")
));
Program.cs File
using EmployeeCRUD.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
// add
builder.Services.AddDbContext<ApplicationDbContext>(
options => options.UseSqlServer(
builder.Configuration.GetConnectionString("DefaultConnection")
));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Step – 10
Run the migration
- Open the package manager console

Type the following command to run the migration
add-migration 'initial'

Migration file

The following is the code of migration file. You can find this file (20220109062010_initial.cs) under Migration folder
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace EmployeeCRUD.Migrations
{
public partial class initial : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Employees",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(type: "nvarchar(max)", nullable: false),
Designation = table.Column<string>(type: "nvarchar(max)", nullable: false),
Address = table.Column<string>(type: "nvarchar(max)", nullable: false),
RecordCreatedOn = table.Column<DateTime>(type: "datetime2", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Employees", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Employees");
}
}
}
Step – 11
Run the following update command to update the database as per this migration file
update-database

Database view after migration

Step – 12
Add Employee Controller
- Right click on Employee folder
- click on add
- click on controller

4. Select MVC Controller Empty and click on Add button

5. Enter the Controller name and press add button

Step – 13
Paste the following code in your EmployeeControler.cs file
using EmployeeCRUD.Data;
using EmployeeCRUD.Models;
using Microsoft.AspNetCore.Mvc;
namespace EmployeeCRUD.Controllers
{
public class EmployeeController : Controller
{
private readonly ApplicationDbContext _context;
public EmployeeController(ApplicationDbContext context)
{
_context = context;
}
public IActionResult Index()
{
IEnumerable<Employee> objCatlist = _context.Employees;
return View(objCatlist);
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Employee empobj)
{
if (ModelState.IsValid)
{
_context.Employees.Add(empobj);
_context.SaveChanges();
TempData["ResultOk"] = "Record Added Successfully !";
return RedirectToAction("Index");
}
return View(empobj);
}
public IActionResult Edit(int? id)
{
if (id == null || id == 0)
{
return NotFound();
}
var empfromdb = _context.Employees.Find(id);
if (empfromdb == null)
{
return NotFound();
}
return View(empfromdb);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(Employee empobj)
{
if (ModelState.IsValid)
{
_context.Employees.Update(empobj);
_context.SaveChanges();
TempData["ResultOk"] = "Data Updated Successfully !";
return RedirectToAction("Index");
}
return View(empobj);
}
public IActionResult Delete(int? id)
{
if (id == null || id == 0)
{
return NotFound();
}
var empfromdb = _context.Employees.Find(id);
if (empfromdb == null)
{
return NotFound();
}
return View(empfromdb);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult DeleteEmp(int? id)
{
var deleterecord = _context.Employees.Find(id);
if (deleterecord == null)
{
return NotFound();
}
_context.Employees.Remove(deleterecord);
_context.SaveChanges();
TempData["ResultOk"] = "Data Deleted Successfully !";
return RedirectToAction("Index");
}
}
}
Step – 14
Add view files
Create one Employee folder under View folder and create the following files
- Index.cshtml
- Create.cshtml
- Edit.cshtml
- Delete.cshtml
Code of Index.cshtml
@model IEnumerable<Employee>
@{
ViewData["Title"] = "Index";
}
@if (TempData["ResultOk"] != null)
{
<h1 class="alert-success">@TempData["ResultOk"]</h1>
}
<div class="container shadow p-5">
<h1 class="text-center mb-3">CRUD Operations Using .NET Core 6 & Microsoft.EntityFrameworkCore </h1>
<div class="col mb-3">
<a asp-controller="Employee" asp-action="Create" class="btn btn-lg btn-primary"><i class="bi bi-file-plus-fill"></i>Add Employee</a>
</div>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th scope="col">Employee Name</th>
<th scope="col">Designation</th>
<th scope="col">Address</th>
<th scope="col">CreatedOn</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td width="20%">
@item.Name
</td>
<td width="20%">
@item.Designation
</td>
<td width="25%">
@item.Address
</td>
<td width="20%">
@item.RecordCreatedOn
</td>
<td>
<div role="group" class="w-60 btn-group">
<a asp-controller="Employee" asp-action="Edit" asp-route-id="@item.Id" class=" btn btn-sm btn-primary"><i class="bi bi-pencil-square"></i>Edit</a>
<a asp-controller="Employee" asp-action="Delete" asp-route-id="@item.Id" class="btn btn-sm btn-danger"><i class="bi bi-trash-fill"></i>Delete</a>
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
Create.cshtml
@model Employee
<div class="container shadow p-5">
<div class="row pb-2">
<h2>Add Employee</h2>
</div>
<form method="post">
<div asp-validation-summary="All"></div>
<div class="form-row">
<div class="form-group col-md-6">
<label asp-for="Name">Employee Name</label>
<input type="text" class="form-control mb-3" asp-for="Name" placeholder="Enter Name">
<span asp-validation-for="Name" class=" alert-danger"></span>
</div>
<div class="form-group col-md-6">
<label asp-for="Designation">Designation</label>
<input type="text" class="form-control mb-3" asp-for="Designation" placeholder="Enter Designation">
<span asp-validation-for="Designation" class=" alert-danger"></span>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label asp-for="Address">Address</label>
<input type="text" class="form-control mb-3" asp-for="Address" placeholder="Enter Address">
<span asp-validation-for="Address" class=" alert-danger"></span>
</div>
<div class="form-group col-md-6 mb-3">
<label asp-for="RecordCreatedOn">Created On</label>
<input type="datetime-local" class="form-control" asp-for="RecordCreatedOn">
<span asp-validation-for="RecordCreatedOn" class=" alert-danger"></span>
</div>
</div>
<button type="submit" class="btn btn-lg btn-primary p-2"><i class="bi bi-file-plus-fill"></i>Save</button>
<a asp-controller="Employee" asp-action="Index" class="btn btn-lg btn-warning p-2">Back To List</a>
</form>
</div>
@section Scripts{
@{
<partial name="_ValidationScriptsPartial" />
}
}
Edit.cshtml
@model Employee
<div class="container shadow p-5">
<div class="row pb-2">
<h2>Edit Employee</h2>
</div>
<form method="post" asp-action="Edit">
<div asp-validation-summary="All"></div>
<div class="form-row">
<div class="form-group col-md-6">
<label asp-for="Name">Employee Name</label>
<input type="text" class="form-control mb-3" asp-for="Name">
<span asp-validation-for="Name" class=" alert-danger"></span>
</div>
<div class="form-group col-md-6">
<label asp-for="Designation">Designation</label>
<input type="text" class="form-control mb-3" asp-for="Designation">
<span asp-validation-for="Designation" class=" alert-danger"></span>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label asp-for="Address">Address</label>
<input type="text" class="form-control mb-3" asp-for="Address">
<span asp-validation-for="Address" class=" alert-danger"></span>
</div>
<div class="form-group col-md-6 mb-3">
<label asp-for="RecordCreatedOn">Created On</label>
<input type="datetime-local" class="form-control" asp-for="RecordCreatedOn">
<span asp-validation-for="RecordCreatedOn" class=" alert-danger"></span>
</div>
</div>
<button type="submit" class="btn btn-lg btn-primary p-2"><i class="bi bi-file-plus-fill"></i>Update</button>
<a asp-controller="Employee" asp-action="Index" class="btn btn-lg btn-warning p-2">Back To List</a>
</form>
</div>
@section Scripts{
@{
<partial name="_ValidationScriptsPartial" />
}
}
Delete.cshtml
@model Employee
<div class="container shadow p-5">
<div class="row pb-2">
<h2>Delete Employee</h2>
</div>
<form method="post" asp-action="DeleteEmp">
<input asp-for="Id" hidden />
<div asp-validation-summary="All"></div>
<div class="form-row">
<div class="form-group col-md-6">
<label asp-for="Name">Employee Name</label>
<input type="text" class="form-control mb-3" asp-for="Name" disabled>
<span asp-validation-for="Name" class=" alert-danger"></span>
</div>
<div class="form-group col-md-6">
<label asp-for="Designation">Designation</label>
<input type="text" class="form-control mb-3" asp-for="Designation" disabled>
<span asp-validation-for="Designation" class=" alert-danger"></span>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label asp-for="Address">Address</label>
<input type="text" class="form-control mb-3" asp-for="Address" disabled>
<span asp-validation-for="Address" class=" alert-danger"></span>
</div>
<div class="form-group col-md-6 mb-3">
<label asp-for="RecordCreatedOn">Created On</label>
<input type="datetime-local" class="form-control" asp-for="RecordCreatedOn" disabled>
<span asp-validation-for="RecordCreatedOn" class=" alert-danger"></span>
</div>
</div>
<button type="submit" class="btn btn-lg btn-danger p-2"><i class="bi bi-trash-fill"></i>Delete</button>
<a asp-controller="Employee" asp-action="Index" class="btn btn-lg btn-warning p-2">Back To List</a>
</form>
</div>
@section Scripts{
@{
<partial name="_ValidationScriptsPartial" />
}
}
Step – 15
Finally run the app and test all functionalities !