Dapper është një kornizë mikro-ORM (Object Relational Mapping) për .NET që është e lehtë, e shpejtë dhe e lehtë për t'u përdorur. Ai u krijua nga Sam Saffron i famës Stack Overflow dhe u krijua për të ofruar akses të shpejtë të të dhënave për mikroshërbime dhe aplikacione të tjera të lehta.

Dapper është një ORM i bazuar në metodën e zgjerimit që lejon zhvilluesit të hartojnë rezultatet e pyetjeve SQL në objekte të shtypura fort. Është projektuar të jetë i thjeshtë dhe i shpejtë dhe ofron një shkallë të lartë fleksibiliteti, duke i lejuar zhvilluesit të punojnë me pyetje të papërpunuara SQL ose të ndërtojnë pyetje duke përdorur ndërtuesin e integruar të pyetjeve.

Dapper nuk ofron grupin e plotë të veçorive të kornizave më të mëdha ORM si Entity Framework, por është një zgjedhje e mirë për zhvilluesit që duhet të ekzekutojnë pyetje komplekse shpejt dhe me efikasitet. Për shkak të thjeshtësisë dhe shpejtësisë së tij, Dapper është një zgjedhje e mirë për zhvilluesit që kanë nevojë të ekzekutojnë pyetje komplekse me shpejtësi dhe me efikasitet. përdoret shpesh në aplikacione me performancë të lartë, të tilla si sistemet e tregtimit financiar ose aplikacionet e përpunimit të të dhënave në kohë reale.

Krijo projekt të ri duke përdorur Visual Studio 2022

Paketat e kërkuara të instaluara

dotnet add package Microsoft.Data.SqlClient --version 5.1.1
dotnet add package Dapper.Extensions.NetCore --version 4.2.2

Shto lidhjen e bazës së të dhënave

  "ConnectionStrings": {
    "DefaultConnectionMSSQLNoCred": "Server=DESKTOP-99Q87I2\\MSSQLSERVER2017;Database=DapperCRUD;Trusted_Connection=True;MultipleActiveResultSets=true",
    "connMSSQL": "Server=DESKTOP-99Q87I2\\MSSQLSERVER2017;Database=DapperCRUD;User ID=sa;Password=dev123456;TrustServerCertificate=True;MultipleActiveResultSets=true"
  }

Skripti i tabelës së bazës së të dhënave

/****** Object:  Table [dbo].[Branch]    Script Date: 5/8/2023 1:30:32 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Branch](
 [Id] [bigint] IDENTITY(1,1) NOT NULL,
 [Name] [nvarchar](max) NULL,
 [Description] [nvarchar](max) NULL,
 [CreatedDate] [datetime2](7) NOT NULL,
 [UpdatedDate] [datetime2](7) NULL,
 CONSTRAINT [PK_Branch] PRIMARY KEY CLUSTERED 
(
 [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Krijo Kontekst Dapper

public interface IDapperContext
    {
        IDbConnection CreateConnection();
    }
public class DapperContext: IDapperContext
    {
        private readonly IConfiguration _iConfiguration;
        private readonly string _connString;
        public DapperContext(IConfiguration iConfiguration)
        {
            _iConfiguration = iConfiguration;
            _connString = _iConfiguration.GetConnectionString("connMSSQL");
        }
        public IDbConnection CreateConnection() => new SqlConnection(_connString);
    }

Krijo model

public class BaseEntity
    {
        public Int64 Id { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime? UpdatedDate { get; set; }
    }
public class Branch: BaseEntity
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }

Krijoni një depo të modelit

public interface IBranchRepository
    {
        Task<IEnumerable<Branch>> GetAllAsync();
        Task<Branch> GetByIdAsync(Int64 id);
        Task Create(Branch _Branch);
        Task Update(Branch _Branch);
        Task Delete(Int64 id);
    }

Zbatoni IRepository

public class BranchRepository : IBranchRepository
    {
        private readonly IDapperContext _context;
        public BranchRepository(IDapperContext context)
        {
            _context = context;
        }

        public async Task<IEnumerable<Branch>> GetAllAsync()
        {
            var query = "SELECT * FROM " + typeof(Branch).Name;
            using (var connection = _context.CreateConnection())
            {
                var result = await connection.QueryAsync<Branch>(query);
                return result.ToList();
            }
        }
        public async Task<Branch> GetByIdAsync(Int64 id)
        {
            var query = "SELECT * FROM " + typeof(Branch).Name + " WHERE Id = @Id";

            using (var connection = _context.CreateConnection())
            {
                var result = await connection.QuerySingleOrDefaultAsync<Branch>(query, new { id });
                return result;
            }
        }
        public async Task Create(Branch _Branch)
        {
            var query = "INSERT INTO " + typeof(Branch).Name + " (Name, Description, CreatedDate,UpdatedDate) VALUES (@Name, @Description, @CreatedDate, @UpdatedDate)";
            var parameters = new DynamicParameters();
            parameters.Add("Name", _Branch.Name, DbType.String);
            parameters.Add("Description", _Branch.Description, DbType.String);
            parameters.Add("CreatedDate", _Branch.CreatedDate, DbType.DateTime);
            parameters.Add("UpdatedDate", _Branch.UpdatedDate, DbType.DateTime);
            using (var connection = _context.CreateConnection())
            {
                await connection.ExecuteAsync(query, parameters);
            }
        }
        public async Task Update(Branch _Branch)
        {
            var query = "UPDATE " + typeof(Branch).Name + " SET Name = @Name, Description = @Description, UpdatedDate = @UpdatedDate WHERE Id = @Id";
            var parameters = new DynamicParameters();
            parameters.Add("Id", _Branch.Id, DbType.Int64);
            parameters.Add("Name", _Branch.Name, DbType.String);
            parameters.Add("Description", _Branch.Description, DbType.String);
            parameters.Add("UpdatedDate", _Branch.UpdatedDate, DbType.DateTime);
            using (var connection = _context.CreateConnection())
            {
                await connection.ExecuteAsync(query, parameters);
            }
        }
        public async Task Delete(Int64 id)
        {
            var query = "DELETE FROM " + typeof(Branch).Name + " WHERE Id = @Id";
            using (var connection = _context.CreateConnection())
            {
                await connection.ExecuteAsync(query, new { id });
            }
        }
    }

Shërbimet e injektimit

builder.Services.AddTransient<IDapperContext, DapperContext>();
builder.Services.AddTransient<IBranchRepository, BranchRepository>();

Projekti i plotë

Produkti i Projektit

Avantazhi i Dapper ORM

Ka disa avantazhe të përdorimit të Dapper ORM:

  1. Performanca:Dapper është shumë i shpejtë në krahasim me ORM-të e tjera sepse përdor gjenerimin dinamik të SQL dhe hartën e objekteve të lehta.
  2. Thjeshtësia: Dapper është shumë i lehtë për t'u përdorur dhe konfiguruar. Ka një API të thjeshtë dhe intuitiv që kërkon konfigurim dhe konfigurim minimal.
  3. Fleksibiliteti:Dapper ofron shumë fleksibilitet kur bëhet fjalë për hartimin e rezultateve të bazës së të dhënave me objekte. Kjo ju lejon të hartoni rezultatet në POCO, objekte dinamike dhe madje edhe XML.
  4. Light: Dapper është një ORM i lehtë që ka një gjurmë të vogël dhe nuk i shton shumë shpenzime aplikacionit tuaj.
  5. Përputhshmëria: Dapper është i pajtueshëm me shumë baza të dhënash të ndryshme, duke përfshirë SQL Server, MySQL, Oracle dhe PostgreSQL.

Në përgjithësi, Dapper është një zgjedhje e shkëlqyer për zhvilluesit që kanë nevojë për një ORM të lehtë dhe fleksibël që mund të sigurojë performancë të shpejtë dhe integrim të lehtë me një gamë të gjerë bazash të dhënash.

Si përfundim, Dapper është një ORM i lehtë, i thjeshtë dhe i shpejtë që mund të përdoret në vend të Entity Framework Core për akses të të dhënave në një aplikacion ASP.NET Core MVC. Në këtë artikull, ne pamë se si të krijojmë një aplikacion të ri ASP.NET Core MVC, të konfigurojmë Dapper dhe lidhjen e bazës së të dhënave, të krijojmë një klasë modeli dhe të kryejmë operacione CRUD në bazën e të dhënave duke përdorur Dapper.

Përdorimi i Dapper mund të ofrojë përfitime të performancës për shkak të natyrës së tij të lehtë dhe qasjes afër metalit. Megjithatë, kjo do të thotë gjithashtu se ka më pak abstraksion dhe për këtë arsye potencialisht më shumë kod kërkohet për operacionet CRUD në krahasim me Entity Framework Core.

Në fund të fundit, zgjedhja midis Dapper dhe Entity Framework Core varet nga kërkesat specifike të aplikacionit tuaj, duke përfshirë nevojat e performancës, kompleksitetin dhe njohjen e ekipit të zhvillimit me secilin mjet.

"👋 Portofoli im"

🚀 Kanali im në Youtube

"💻 Github"