Memulai Aplikasi Web ASP.NET Core 5.0 MVC Menggunakan Dapper ORM Dan SQL Server

  • Whatsapp
Memulai Aplikasi Web ASP.NET Core 5.0 MVC Menggunakan Dapper ORM Dan SQL Server

Halo semua,

Dalam tutorial ini, saya akan mendemonstrasikan cara membuat Aplikasi Web ASP.NET Core 5.0 MVC CRUD menggunakan Dapper ORM yang merupakan alternatif untuk Entity Framework dan RepoDB ORM. Saya telah menerbitkan artikel ASP.NET MVC dan ASP.NET Webforms sebelum menggunakan Dapper ORM di blog ini dan telah menggunakan ORM ini dalam aplikasi internal. Dengan lahirnya kerangka .NET Core, inilah saatnya untuk bergabung dengan kereta musik mempromosikan alat jenis ini yang membantu memaksimalkan produktivitas pengembang dengan membuat artikel sebagai panduan atau referensi. Cukup dengan obrolan dan mari mulai membuat kode. 🙂

I. Setup Proyek

1. Buat tabel Pelanggan dalam database SQL Server menggunakan skrip di bawah ini.

Bacaan Lainnya

USE [Your_Database]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Customer](
[CustomerID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[CompanyName] [varchar](40) NULL,
[Address] [varchar](35) NULL,
[City] [varchar](35) NULL,
[State] [varchar](35) NULL,
[IntroDate] [datetime] NULL,
[CreditLimit] [decimal](18, 2) NULL,
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
(
[CustomerID] 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

2. Selanjutnya adalah membuat Aplikasi Web ASP.NET Core 5.0 MVC baru menggunakan Visual Studio 2019.
3. Kemudian tambahkan folder baru bernama Data Access Layer dengan dua subfolder yaitu Repository dan UnitOfWork. Struktur proyek identik dengan tutorial saya sebelumnya tentang RepoDB dan Entity Framework Core.

Memulai Aplikasi Web ASP.NET Core 5.0 MVC Menggunakan Dapper ORM Dan SQL Server

4. Tambahkan paket NuGet Dapper dan System.Data.SqlClient di proyek Anda. Pada saat penulisan, versi Dapper yang diinstal adalah 2.0.90.

Memulai Aplikasi Web ASP.NET Core 5.0 MVC Menggunakan Dapper ORM Dan SQL Server

5. Instal versi Font-Awesome 5.x melalui Library Manager di Visual Studio.

Memulai Aplikasi Web ASP.NET Core 5.0 MVC Menggunakan Dapper ORM Dan SQL Server

6. Dalam appsettings.json proyek, tambahkan string koneksi ke database yang menyimpan informasi pelanggan. Ganti nama server dan database dengan nama server dan db yang sebenarnya di komputer Anda.

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"ASPCoreRepoDB": "Server=Your_server;Database=Your_DB;Integrated Security=True"
}
}

II. Coding Kelas Model

1. Dalam folder Model dari proyek yang dibuat, tambahkan kelas baru bernama Pelanggan yang memiliki nama properti yang mirip dengan bidang tabel yang baru saja Anda buat menggunakan skrip di bagian Penataan Proyek. Properti akan digunakan untuk menyimpan informasi yang terikat ke kontrol di halaman.

public class Customer
{
public int CustomerID { get; set; }

[Display(Name = "Company Name")]
public string CompanyName { get; set; }

[Display(Name = "Address")]
public string Address { get; set; }

[Display(Name = "City")]
public string City { get; set; }

[Display(Name = "State")]
public string State { get; set; }

[Display(Name = "Intro Date")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime IntroDate { get; set; }

[Display(Name = "Credit Limit")]
[DisplayFormat(DataFormatString = "{0:n2}")]
public decimal CreditLimit { get; set; }
}

AKU AKU AKU. Mengkodekan Kelas dan Antarmuka Akses Data (Repositori dan Unit Kerja)

Di bagian ini, kita akan membuat inferaces dan kelas menggunakan Pola Desain Repositori dan Unit Kerja. Kelas repositori akan berisi kueri dan metode yang akan memanfaatkan metode Dapper untuk menangani operasi CRUD (Buat / Perbarui / Hapus). Untuk penjelasan lebih lanjut, silakan merujuk ke halaman ini Menerapkan Repositori dan Unit Pola Kerja dalam Aplikasi ASP.NET MVC disediakan oleh Microsoft.

1. Tambahkan antarmuka IRepository dengan tipe generik dan definisi fungsi umum untuk operasi CRUD seperti FindByID (), GetAll (), Add (), Delete () dan Update ().

public interface IRepository<T> where T : class{
T FindByID(int ID);
IEnumerable<T> GetAll();
int Add();
int Update();
int Delete(int ID);
}

2. Buat kelas yang disebut GenericRepository yang mengimplementasikan antarmuka IRepository. Kelas ini memiliki dua variabel yaitu IConfiguration yang mengambil nilai string koneksi dari appsettings.json dan string koneksi. File ini juga berisi beberapa properti untuk pernyataan query dan parameter SQL yang digunakan oleh Dapper. Dalam metode konstruktor, setel nilai untuk variabel IConfiguration menggunakan injeksi konstruktor. Setelah diinisialisasi, gunakan metode GetConnectionString () untuk mengambil nilai string koneksi dan menyimpannya ke variabel tingkat kelas. Kelas ini juga mengimplementasikan metode yang ditentukan dalam antarmuka IRepository menggunakan fungsi bawaan Dapper ORM untuk memanipulasi informasi database.

public class GenericRepository<T> : IRepository<T> where T : class{
private readonly IConfiguration _configuration;
private readonly string connectionString;
public string InsertQuery { get; set; }
public string UpdateQuery { get; set; }
public string GetByIDQuery { get; set; }
public string DeleteQuery { get; set; }
public string GetAllQuery { get; set; }
public List<SqlParameter> InsertParams { get; set; }
public List<SqlParameter> UpdateParams { get; set; }

public GenericRepository(IConfiguration configuration)
{
_configuration = configuration;
connectionString = _configuration.GetConnectionString("ASPCoreRepoDB");

InsertQuery = string.Empty;
UpdateQuery = string.Empty;
GetByIDQuery = string.Empty;
DeleteQuery = string.Empty;
GetAllQuery = string.Empty;
InsertParams = new List<SqlParameter>();
UpdateParams = new List<SqlParameter>();
}

public int Add()
{
int affectedRows = 0;

try
{
var args = new DynamicParameters(new { });
InsertParams.ForEach(p => args.Add(p.ParameterName, p.Value));

using (var connection = new SqlConnection(this.connectionString))
{
affectedRows = connection.Execute(InsertQuery, args);
}
}
catch (Exception ex)
{
return affectedRows;
}

return affectedRows;
}

public int Update()
{
int affectedRows = 0;

try
{
var args = new DynamicParameters(new { });
UpdateParams.ForEach(p => args.Add(p.ParameterName, p.Value));

using (var connection = new SqlConnection(this.connectionString))
{
affectedRows = connection.Execute(UpdateQuery, args);
}
}
catch (Exception ex)
{
return affectedRows;
}

return affectedRows;
}

public int Delete(int ID)
{
int affectedRows = 0;

try
{
using (var connection = new SqlConnection(this.connectionString))
{
affectedRows = connection.Execute(DeleteQuery, new { ID = ID });
}
}
catch (Exception ex)
{
return affectedRows;
}

return affectedRows;
}

public T FindByID(int ID)
{
T result;

try
{
using (var connection = new SqlConnection(this.connectionString))
{
result = connection.Query<T>(GetByIDQuery, new { ID = ID }).FirstOrDefault();
}
}
catch (Exception ex)
{
return null;
}

return result;
}

public IEnumerable<T> GetAll()
{
List<T> lstRecords = new List<T>();

try
{
using (var connection = new SqlConnection(this.connectionString))
{
lstRecords = connection.Query<T>(GetAllQuery).ToList();
}
}
catch (Exception ex)
{
return null;
}

return lstRecords;
}
}

3. Tambahkan antarmuka ICustomerRepository yang mewarisi antarmuka IRepository. Antarmuka ini memiliki dua definisi fungsi. Definisi fungsi pertama yang disebut SetInsertParams akan mengatur parameter penyimpanan dan SetUpdateParams untuk parameter pembaruan.

public interface ICustomerRepository : IRepository<Customer>
{
public void SetInsertParams(Customer customer);
public void SetUpdateParams(Customer customer);
}

4. Buat kelas CustomerRepository yang mewarisi kelas GenericRepository dan menerapkan metode SetInsertParams dan SetUpdateParams antarmuka ICustomerRepository.

public class CustomerRepository : GenericRepository<Customer>, ICustomerRepository
{
public CustomerRepository(IConfiguration _configuration) : base(_configuration)
{
SetQueries();
}

private void SetQueries()
{
GetAllQuery = "SELECT* From Customer;";
GetByIDQuery = "SELECT * FROM Customer WHERE [email protected]";
DeleteQuery = "DELETE FROM Customer WHERE CustomerID = @ID";
InsertQuery = "INSERT INTO Customer(CompanyName,Address,City,State,IntroDate,CreditLimit)"
+ " Values(@CompanyName,@Address,@City,@State,@IntroDate,@CreditLimit)";
UpdateQuery = " UPDATE Customer SET CompanyName = @CompanyName,Address = @Address, "
+ " City = @City,State = @State,IntroDate = @IntroDate,CreditLimit = @CreditLimit"
+ " WHERE CustomerID = @CustomerID";
}

public void SetInsertParams(Customer customer)
{
InsertParams = new List<SqlParameter>()
{
new SqlParameter("@CompanyName", customer.CompanyName),
new SqlParameter("@Address",customer.Address),
new SqlParameter("@City",customer.City),
new SqlParameter("@State",customer.State),
new SqlParameter("@IntroDate",customer.IntroDate),
new SqlParameter("@CreditLimit",customer.CreditLimit)
};
}

public void SetUpdateParams(Customer customer)
{
UpdateParams = new List<SqlParameter>()
{
new SqlParameter("@CustomerID",customer.CustomerID),
new SqlParameter("@CompanyName",customer.CompanyName),
new SqlParameter("@Address",customer.Address),
new SqlParameter("@City",customer.City),
new SqlParameter("@State",customer.State),
new SqlParameter("@IntroDate",customer.IntroDate),
new SqlParameter("@CreditLimit",customer.CreditLimit)
};
}
}

5. Di dalam folder UnitOfWork Anda, buat antarmuka IUnitOfWork dengan properti CustomerRepository tipe ICustomerRepository tanpa penyetel.

public interface IUnitOfWork
{
ICustomerRepository CustomerRepository { get; }
}

6. Tentukan kelas UnitOfWork yang mengimplementasikan antarmuka IUnitOfWork dan memiliki konstruktor yang akan menetapkan properti CustomerRepository. Mekanisme injeksi konstruktor akan ditangani oleh metode ConfigureServices di file Startup.cs melalui metode AddTransient ().

public class UnitOfWork : IUnitOfWork
{
public ICustomerRepository CustomerRepository { get; private set; }

public UnitOfWork(ICustomerRepository customerRepository)
{
CustomerRepository = customerRepository;
}
}

7. Dalam Startup.cs, buat beberapa registrasi melalui Dependency Injection dengan memanggil metode AddTransient () untuk jenis layanan yang merupakan parameter pertama dan implementasinya.

public void ConfigureServices(IServiceCollection services)
{
services.AddTransient(typeof(IRepository<>), typeof(GenericRepository<>));
services.AddTransient<ICustomerRepository, CustomerRepository>();
services.AddTransient<IUnitOfWork, UnitOfWork>();

services.AddControllersWithViews();
}

IV. Mengkodekan Pengontrol

Di kelas HomeController.cs, buat variabel Unit Of Work tingkat kelas yang kemudian akan diberi nilai melalui konstruktor HomeController. Agar ini bekerja, Anda sudah memetakan jenis layanan dan implementasinya dalam metode ConfigureServices file Startup.cs. Berikutnya adalah menghasilkan metode ActionResult yang akan menampilkan semua pelanggan ke tampilan, menambahkan pelanggan baru ke database, memperbarui informasi pelanggan dan menghapus catatan tertentu dari database. Setiap metode ActionResult akan memanggil metode CRUD (Buat / Perbarui / Hapus) dari kelas repositori menggunakan beberapa fungsi bawaan Dapper ORM melalui variabel Unit Of Work.

public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private IUnitOfWork _unitOfWork;

public HomeController(ILogger<HomeController> logger, IUnitOfWork unitOfWork)
{
_logger = logger;
_unitOfWork = unitOfWork;
}

public IActionResult Index()
{
List<Customer> model;

model = new List<Customer>();
model = _unitOfWork.CustomerRepository.GetAll().ToList();

return View(model);
}

[HttpGet]
public IActionResult Create()
{
return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Customer customer)
{
if (ModelState.IsValid)
{
_unitOfWork.CustomerRepository.SetInsertParams(customer);
_unitOfWork.CustomerRepository.Add();

return RedirectToAction("Index");
}

return View("Index");
}

[HttpGet]
public IActionResult Edit(int? id)
{
Customer model;

model = new Customer();

if (id == null)
return NotFound();

model = _unitOfWork.CustomerRepository.FindByID(Convert.ToInt32(id));

if (model == null)
return NotFound();

return View(model);
}

[HttpPost]
public ActionResult Edit(Customer customer)
{
try
{
_unitOfWork.CustomerRepository.SetUpdateParams(customer);
_unitOfWork.CustomerRepository.Update();
return RedirectToAction("Index");
}
catch
{
return View();
}
}

[HttpGet]
public IActionResult Delete(int? id)
{
Customer model;

model = new Customer();

if (id == null)
return NotFound();

model = _unitOfWork.CustomerRepository.FindByID(Convert.ToInt32(id));

if (model == null)
return NotFound();

return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(Customer customer)
{
try
{
_unitOfWork.CustomerRepository.Delete(customer.CustomerID);
return RedirectToAction("Index");
}
catch
{
return View();
}
}

public IActionResult Privacy()
{
return View();
}

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}

V. Mengkode Tampilan

1. Layout.cshtml – Referensi pustaka jQuery dan file css fontawesome secara khusus fontawesome.css, regular.min.css dan solid.min.css.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - XYZ Customer Information System</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
<link rel="stylesheet" href="~/lib/font-awesome/css/fontawesome.css" />
<link rel="stylesheet" href="~/lib/Font-Awesome/css/regular.min.css">
<link rel="stylesheet" href="~/lib/Font-Awesome/css/solid.min.css">
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>

2. Index.cshtml – Halaman ini memiliki tabel yang akan diisi dengan catatan yang diambil dari tabel Pelanggan. Setiap baris memiliki tombol hapus dan edit yang mengarahkan untuk menghapus dan mengedit halaman. Halaman ini juga memiliki tombol baru yang membuka tambahkan catatan pelanggan baru.

@model IEnumerable<ASPCoreMVCDapper.Models.Customer>

@{
ViewData["Title"] = "Index";
}

<div id="divIndexHeader">
<h3>Athletes Record Monitoring</h3>
</div>

<div id="divIndexCreate" class="row">
<a asp-action="Create" class="btn btn-primary">
<i class="fas fa-plus"><span> Add Customer</span></i>
</a>
</div>
<div class="row">
<table id="tblRecords" class="table table-bordered table-striped">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.CustomerID)
</th>
<th>
@Html.DisplayNameFor(model => model.CompanyName)
</th>
<th>
@Html.DisplayNameFor(model => model.Address)
</th>
<th>
@Html.DisplayNameFor(model => model.City)
</th>
<th>
@Html.DisplayNameFor(model => model.State)
</th>
<th>
@Html.DisplayNameFor(model => model.IntroDate)
</th>
<th>
@Html.DisplayNameFor(model => model.CreditLimit)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.CustomerID)
</td>
<td>
@Html.DisplayFor(modelItem => item.CompanyName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Address)
</td>
<td>
@Html.DisplayFor(modelItem => item.City)
</td>
<td>
@Html.DisplayFor(modelItem => item.State)
</td>
<td>
@Html.DisplayFor(modelItem => item.IntroDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.CreditLimit)
</td>
<td>
<a asp-action="Edit" title="Edit Customer" asp-route-id="@item.CustomerID">
<i class="fas fa-edit"></i>
</a>
<a asp-action="Delete" title="Delete Customer" asp-route-id="@item.CustomerID">
<i class="fas fa-trash"></i>
</a>
</td>
</tr>
}
</tbody>
</table>
</div>
@section scripts{
<link href="~/css/Customer.css" rel="stylesheet" />
}

3. Create.cshtml – Tampilan ini mengawasi penambahan pelanggan baru ke database.

@model ASPCoreMVCDapper.Models.Customer

@{
ViewData["Title"] = "Create";
}

<div>
<h3>Add New Customer</h3>
</div>
<hr />
<div class="row">
<div class="col-6">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group row">
<label asp-for="CompanyName" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="CompanyName" class="form-control" />
<span asp-validation-for="CompanyName" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="Address" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="Address" class="form-control" />
<span asp-validation-for="Address" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="City" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="City" class="form-control" />
<span asp-validation-for="City" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="State" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="State" class="form-control" />
<span asp-validation-for="State" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="IntroDate" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="IntroDate" type="date" class="form-control" />
<span asp-validation-for="IntroDate" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="CreditLimit" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="CreditLimit" class="form-control" />
<span asp-validation-for="CreditLimit" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<div class="col-4"></div>
<div class="col-8">
<input type="submit" value="Save" class="btn btn-primary" />
<a asp-action="Index" class="btn btn-info">Back to List</a>
</div>
</div>
</form>
</div>
</div>

@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

4. Edit.cshtml – Halaman ini mengatur pembaruan pelanggan yang ada dari database. Tata letak formulir identik dengan halaman Buat kecuali memiliki bidang tersembunyi untuk ID Pelanggan.

@model ASPCoreMVCDapper.Models.Customer

@{
ViewData["Title"] = "Edit";
}

<div>
<h3>Edit Customer</h3>
</div>
<hr />
<div class="row">
<div class="col-md-6">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="CustomerID" />
<div class="form-group row">
<label asp-for="CompanyName" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="CompanyName" class="form-control" />
<span asp-validation-for="CompanyName" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="Address" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="Address" class="form-control" />
<span asp-validation-for="Address" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="City" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="City" class="form-control" />
<span asp-validation-for="City" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="State" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="State" class="form-control" />
<span asp-validation-for="State" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="IntroDate" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="IntroDate" type="date" class="form-control" />
<span asp-validation-for="IntroDate" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="CreditLimit" class="control-label col-4"></label>
<div class="col-8">
<input asp-for="CreditLimit" class="form-control" />
<span asp-validation-for="CreditLimit" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<div class="col-4"></div>
<div class="col-8">
<input type="submit" value="Save" class="btn btn-primary" />
<a asp-action="Index" class="btn btn-info">Back to List</a>
</div>
</div>
</form>
</div>
</div>

@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

5. Delete.cshtml – Halaman ini akan menangani penghapusan record pelanggan. Ketika formulir dikirim, itu akan memanggil metode Hapus di pengontrol dan menghapus catatan itu dari database berdasarkan ID Pelanggan.

@model ASPCoreMVCDapper.Models.Customer

@{
ViewData["Title"] = "Delete";
}

<div>
<h3>Are you sure you want to delete this record?</h3>
</div>

<hr />
<div>
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.CustomerID)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.CustomerID)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.CompanyName)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.CompanyName)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Address)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Address)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.City)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.City)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.State)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.State)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.IntroDate)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.IntroDate)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.CreditLimit)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.CreditLimit)
</dd>
</dl>

<form asp-action="Delete">
<input type="hidden" asp-for="CustomerID" />
<input type="submit" value="Delete" class="btn btn-danger" />
<a asp-action="Index" class="btn btn-info">Back to List</a>
</form>
</div>

6. Customer.css – File ini berisi gaya css kustom untuk tampilan.

#divIndexCreate {
margin-top: 20px;
margin-bottom: 20px;
}

#divIndexHeader {
margin-top: 50px;
margin-bottom: 50px;
text-align:center;
}

#tblRecords{
border-radius: 5px;
}

VI. Membungkus

Ini adalah artikel ketiga yang saya buat sehubungan dengan ORM yang sudah ada yang banyak digunakan oleh komunitas .NET. Pertama adalah Entity Framework Core Microsoft dan kedua adalah RepoDB ORM Michael Camara Pendon. Masing-masing memiliki batasan dan kelebihannya sendiri. Terserah Anda sebagai arsitek atau pengembang untuk memutuskan ORM mana yang layak untuk proyek Anda.

Keluaran

Memulai Aplikasi Web ASP.NET Core 5.0 MVC Menggunakan Dapper ORM Dan SQL Server

Pos terkait

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *