How to Create asp.net core mvc CRUD upload image app using db 1st approach
Step 1: Create the Database
- Open SQL Server and create a new database (e.g., 
ImageCRUDDB). - Create a table to store image details:
 
CREATE TABLE Product(
    Id INT PRIMARY KEY IDENTITY(1,1),
    NameNVARCHAR(100) NOT NULL,
    Price INT,
    ImagePath NVARCHAR(MAX),
);
Step 2: Set Up Your Project
- Create a new ASP.NET Core MVC project in Visual Studio.
 - Add a folder named 
wwwroot/imagesfor storing uploaded images. 
Step 3: Scaffold the Database Context
- Add the NuGet package for Entity Framework Core tools:
 
     2. Scaffold the database to generate the model and context:
Scaffold-DbContext "Server=YourServerName;Database=ImageCRUDDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
After getting the auto-generated DbContext file delete the warning message(connection string) .
Step 4: Add connection string in appsetting.json file
,
    "ConnectionStrings": {
        "DefaultConnection": "Server = DESKTOP-9M9EDAA\\SQLEXPRESS; Database = imageDb; Trusted_Connection = True; MultipleActiveResultSets = True; TrustServerCertificate = True;"
    }
Step 5: Add service in program.cs file
builder.Services.AddDbContext<ImageDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
Step 6: Add Product.cs and ProductVM.cs model in model folder
Product.cs
public partial class Product
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; } = null!;
    [Required]
    public int Price { get; set; }
    [Required]
    public string ImagePath { get; set; } = null!;
}
ProductVM.cs
public partial class Product
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; } = null!;
    [Required]
    public int Price { get; set; }
    [Required]
     public IFormFile Photo { get; set; } = null!;
}
Step 7: Add ProductController.cs
public class ProductController : Controller
{
    ImageDbContext _db;
    IWebHostEnvironment _env;
    public ProductController(ImageDbContext db, IWebHostEnvironment env)
    {
        _db = db;
        _env = env;
    }
    public IActionResult Index()
    {
        return View(_db.Products.ToList());
    } 
    public IActionResult AddProduct()
    {
        return View();
    }
    [HttpPost]
    public IActionResult  AddProduct(ProductVM prod)
    {
        string fileName = "";
        if (prod.Photo != null)
        {
            string folder = Path.Combine(_env.WebRootPath, "images");
            fileName = Guid.NewGuid().ToString() + "" + prod.Photo.FileName;
            string filePath = Path.Combine(folder, fileName);
            prod.Photo.CopyTo(new FileStream(filePath, FileMode.Create));
            Product p = new Product()
            {
                Name = prod.Name,
                Price = prod.Price,
                ImagePath = fileName
            };
            _db.Products.Add(p);
            _db.SaveChanges();
            TempData["Success"] = "Product Added Successfully!";
            return RedirectToAction("Index");
        }
        return View();
    }
// GET: Products/Edit/5
public async Task<IActionResult> Edit(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var image = await _context.Products.FindAsync(id);
    if (image == null)
    {
        return NotFound();
    }
    return View(image);
}
// POST: Products/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Name, Price,ImagePath")] Product prod, IFormFile newImage)
{
    if (id != prod.Id)
    {
        return NotFound();
    }
    if (ModelState.IsValid)
    {
        try
        {
            var existingImage = await _context.Products.FindAsync(id);
            if (existingImage == null)
            {
                return NotFound();
            }
            // Update Name
            existingImage.Name= image.Name;
            // Handle new image upload
            if (newImage != null)
            {
                string uploadsFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images");
                string uniqueFileName = Guid.NewGuid().ToString() + "_" + newImage.FileName;
                string filePath = Path.Combine(uploadsFolder, uniqueFileName);
                // Save new file
                using (var fileStream = new FileStream(filePath, FileMode.Create))
                {
                    await newImage.CopyToAsync(fileStream);
                }
                // Delete old file if exists
                if (!string.IsNullOrEmpty(existingImage.ImagePath))
                {
                    string oldFilePath = Path.Combine(uploadsFolder, existingImage.ImagePath);
                    if (System.IO.File.Exists(oldFilePath))
                    {
                        System.IO.File.Delete(oldFilePath);
                    }
                }
                // Update database with new image path
                existingImage.ImagePath = uniqueFileName;
            }
            _context.Update(existingImage);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!ImageExists(image.Id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction(nameof(Index));
    }
    return View(image);
}
private bool ImageExists(int id)
{
    return _context.Images.Any(e => e.Id == id);
}
// GET: Products/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }
    var image = await _context.Products
        .FirstOrDefaultAsync(m => m.Id == id);
    if (image == null)
    {
        return NotFound();
    }
    return View(image);
}
}
Step : 8 Add view
Index.cshtml
@model IEnumerable<ImageUpload.models.Product>
@{
    ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
    <a asp-action="Create">Create New</a>
</p>
<p style="color:green">
    @TempData["Success"]
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ImagePath)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                    <img src="~/images/@Html.DisplayFor(modelItem => item.ImagePath)" style="width:100px; height:100px;" />
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>
AddProduct.cshtml
@model ImageUpload.models.ProductVM
@{
    ViewData["Title"] = "AddProduct";
}
<h1>AddProduct</h1>
<h4>Product</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="AddProduct" enctype="multipart/form-data" >
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Price" class="control-label"></label>
                <input asp-for="Price" class="form-control" />
                <span asp-validation-for="Price" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Photo" class="control-label"></label>
                <input asp-for="Photo" class="form-control" />
                <span asp-validation-for="Photo" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>
<div>
    <a asp-action="Index">Back to List</a>
</div>
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Edit.cshtml
@model ImageCRUDApp.Models.Image
@{
    ViewData["Title"] = "Edit Image";
}
<h1>Edit Image</h1>
<div class="row">
    <div class="col-md-6">
        <form asp-action="Edit" enctype="multipart/form-data">
            <input type="hidden" asp-for="Id" />
            <div class="form-group">
                <label asp-for="Title" class="control-label"></label>
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label>Current Image</label><br />
                @if (!string.IsNullOrEmpty(Model.ImagePath))
                {
                    <img src="~/images/@Model.ImagePath" alt="@Model.Title" width="100" height="100" />
                }
                else
                {
                    <p>No image uploaded</p>
                }
            </div>
            <div class="form-group">
                <label asp-for="ImagePath">Upload New Image</label>
                <input type="file" name="newImage" class="form-control" />
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
                <a asp-action="Index" class="btn btn-secondary">Back to List</a>
            </div>
        </form>
    </div>
</div>
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Details.cshtml
@model ImageCRUDApp.Models.Image
@{
    ViewData["Title"] = "Product Details";
}
<h1>Image Details</h1>
<div>
    <h4>Image</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-2">Name</dt>
        <dd class="col-sm-10">@Model.Name</dd>
        <dt class="col-sm-2">Price</dt>
        <dd class="col-sm-10">
            @if (!string.IsNullOrEmpty(Model.ImagePath))
            {
                <img src="~/images/@Model.ImagePath" alt="@Model.Name" width="300" />
            }
            else
            {
                <p>No image available</p>
            }
        </dd>
        <dt class="col-sm-2">Upload Date</dt>
        <dd class="col-sm-10">@Model.UploadDate</dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id" class="btn btn-primary">Edit</a>
    <a asp-action="Index" class="btn btn-secondary">Back to List</a>
</div>
How to Create asp.net core mvc CRUD upload image app using db 1st approach
 
        Reviewed by Rikesh
        on 
        
December 07, 2024
 
        Rating: 
      
No comments: