در این قسمت از دوره پیشرفته Entity Framework Core 9 به جادوی Scaffolding در EF Core میپردازیم. و نحوهی انجام عملیات CRUD را در EF Core 9 با استفاده از ابزار Scaffolding مورد برسی قرار میدهیم. عملیات CRUD مجموعهای از عملیات های پرکاربرد است. که برای ایجاد، خواندن، بهروزرسانی و حذف دادهها استفاده میشود. EF Core 9 امکان ایجاد خودکار کدهای مورد نیاز این عملیات را با Scaffolding فراهم کرده است. این ابزار با تولید مدلها، کنترلرها و Viewها به شما کمک میکند. تا به سرعت و بدون کدنویسی دستی، پروژههای پایگاه دادهمحور خود را توسعه دهید.
Scaffolding به شما امکان میدهد. بدون نیاز به کدنویسی دستی، بهصورت خودکار کدهای موردنیاز را تولید کنید.
در این آموزش، ابتدا با استفاده از Scaffolding یک کنترلر CRUD میسازیم. و هر یک از عملیات را به تفصیل بررسی میکنیم. تا بتوانید پروژههای حرفهایتری با EF Core ایجاد کنید. این آموزش به شما کمک میکند تا با قابلیتهای جدید EF Core 9 و ابزارهای آن به خوبی آشنا شوید و مهارتهای خود را در توسعهی برنامههای ASP.NET Core به سطح بالاتری برسانید.
Scaffolding در EF Core یک ابزار قدرتمند برای تولید خودکار کد است. که به توسعهدهندگان اجازه میدهد. بدون نیاز به کدنویسی دستی، ساختارهای پایهای و عملیات CRUD را برای مدلهای خود ایجاد کنند. این فرآیند با تحلیل مدلهای داده و پایگاه داده، کدهای مرتبط مانند کنترلرها، Viewها و کلاسهای مدل را بهطور خودکار تولید میکند.
استفاده از Scaffolding در EF Core باعث میشود. که زمان توسعه کاهش یابد و خطاهای احتمالی که ممکن است در کدنویسی دستی رخ دهند. به حداقل برسند. و به توسعهدهندگان امکان میدهد که به سرعت ساختارهای اصلی مورد نیاز برای کار با دادهها را بسازند. و تمرکز خود را بر روی بخشهای پیچیدهتر پروژه بگذارند.
private readonly MyDbContext _context;
public UsersController(MyDbContext context)
{
_context = context;
}
// GET: Users
public async Task<IActionResult> Index()
{
return View(await _context.appUsers.ToListAsync());
}
// GET: Users/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var appUser = await _context.appUsers
.FirstOrDefaultAsync(m => m.Id == id);
if (appUser == null)
{
return NotFound();
}
return View(appUser);
}
// GET: Users/Create
public IActionResult Create()
{
return View();
}
// POST: Users/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,Family,City,Gender")] AppUser appUser)
{
if (ModelState.IsValid)
{
_context.Add(appUser);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(appUser);
}
// GET: Users/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var appUser = await _context.appUsers.FindAsync(id);
if (appUser == null)
{
return NotFound();
}
return View(appUser);
}
// POST: Users/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Name,Family,City,Gender")] AppUser appUser)
{
if (id != appUser.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(appUser);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!AppUserExists(appUser.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(appUser);
}
private bool AppUserExists(int id)
{
return _context.appUsers.Any(e => e.Id == id);
}
// GET: Users/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var appUser = await _context.appUsers
.FirstOrDefaultAsync(m => m.Id == id);
if (appUser == null)
{
return NotFound();
}
return View(appUser);
}
// POST: Users/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var appUser = await _context.appUsers.FindAsync(id);
if (appUser != null)
{
_context.appUsers.Remove(appUser);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}