Dapper C# là gì? Micro ORM trong .NET

ORM là gì?

  • Là viết tắt của Object Relational Mapping, nó được xây dựng để liên kết các bảng trên database với các đối tượng trong project.
  • Có 2 cách tiếp cận ORM:
    • Code First: Viết mã đối tượng trước, sinh database sau
    • Database First: Xây dựng database trước, sinh đối tượng sau từ database

Dapper là gì?

  • Dapper là một Micro ORM, (micro để phân biệt với các ORM được xây xây dựng bới các hãng lớn và có nhiều chức năng) được phát triển bới các developer của StackExchange  (nếu các bạn chưa rõ thì họ sở hữu Stack Overflow) dưới dạng phần mềm mã nguồn mở.
  • Họ thiết kế sao cho nó có hiệu năng cao
  • Được xác nhận bới Sam Saffron
  • Là một trong những yêu cầu cơ bản bới phần mềm truy cập cơ sở dữ liệu quan hệ
  • Nếu chúng ta sử dụng kiến trúc 3 tầng với Data Access Layer (DAL) để lấy dữ liệu từ database và thực hiện các thao tác CRUD (create, read, update, delete)
  • Nếu chúng ra sử dụng Entity Framework (EF) của Microsoft và sau đó sử dụng DBContext để tạo kết nối và lấy dữ liệu từ database
  • Giờ chúng ta sẽ làm quen với một cách đơn giản hơn để truy cập database sử dụng open source orm được gọi là Dapper

Tại sao nên dùng Dapper?

  • Speed and fast in performance.
  • Fewer lines of code.
  • Object Mapper.
  • Static Object Binding.
  • Dynamic Object Binding.
  • Easy Handling of SQL Query.
  • Easy Handling of Stored Procedure.
  • Operating directly to IDBConnection class that provides smoothness and running query directly to the database instead of passing data using various objects as we do in EF and ADO.NET.
  • Multiple Query Support.
  • Support for Stored Procedure.
  • Bulk Data insert functionality.
  • Dapper also allows fetching multiple data based on multiple inputs

So sánh hiệu năng của Dapper với các orm khác.

Sử dụng Dapper như thế nào?

  • Lấy thư viện Dapper
  • Dapper làm việc như thế nào?
    • Tạo đối tượng IDBConnection với connection string
    • Viết query và lưu nó như một biến string thông thường
    • Gọi hàm db.Excute() để thực thi câu query
  • Các ví dụ

Các biến cần khỏi tạo:

1
2
3
using Dapper;
static string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
static IDbConnection db = new SqlConnection(connStr);

Các bàng trong cở sở dữ liệu

dapperdemo

Các đối tượng tương ứng trong project

    • Contact
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    class Contact
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Phone { get; set; }
        public List
<Address> Addresss { get; set; }
        public Contact()
        {
            Id = 0;
            Name = string.Empty;
            Phone = string.Empty;
            Addresss = new List
<Address>();
        }
        public override string ToString()
        {
            var bd = new StringBuilder();
            string res = string.Format("ID: {0} - Name: {1} - Phone: {2}", Id, Name, Phone);
            bd.Append(res);
            bd.AppendLine();
            for (int i = 0; i < Addresss.Count; i++)
            {
                var add = Addresss[i];
                bd.Append(string.Format("\tAddressStreet: {0}", add.AddressStreet));
                bd.AppendLine();
            }
            return bd.ToString();
        }
    }
    • Address
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Address
{
    public int Id { get; set; }
    public int StateId { get; set; }
    public int ContactId { get; set; }
    public string AddressStreet { get; set; }
    public Address()
    {
        Id = 0;
        StateId = 0;
        ContactId = 0;
        AddressStreet = string.Empty;
    }
}
    • State
1
2
3
4
5
6
7
8
9
10
11
public class State
{
    public int Id { get; set; }
    public string StateName { get; set; }
    public State()
    {
        Id = 0;
        StateName = string.Empty;
    }
}
      >

    • Ví dụ 1 – Tạo mới một bản ghi Contact
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Add()
        {
            try
            {
                var contact = new Contact();
                Console.WriteLine("Enter Name: ");
                contact.Name = Console.ReadLine();
                Console.WriteLine("Enter Phone: ");
                contact.Phone = Console.ReadLine();
                string query = @"insert into contacts values(@name, @phone);
                            Select Cast (Scope_Identity() as int)";
                int id = db.Query<int>(query, contact).Single();
                contact.Id = id;
                Console.WriteLine("Added: {0}", contact.ToString());
                GetAllData();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    • Ví dụ 2 – Lấy tất cả dữ liệu Contact từ database
1
2
3
4
5
6
7
8
9
10
11
static void GetAllData()
{
    string query = "select * from contacts";
    List<Contact> list = db.Query<Contact>(query).ToList<Contact>();
    Console.WriteLine("All Contact: ");
    int count = list.Count;
    for (int i = 0; i < count; i++)
    {
        Console.WriteLine(list[i].ToString());
    }
}
    • Ví dụ 3 – Tìm Contact theo Id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static Contact Find(int idContact = -1)
        {
            string query = "select * from contacts where id = @id";
            Console.WriteLine("Enter contact ID: ");
            int id = (idContact == -1) ? (Convert.ToInt32(Console.ReadLine())) : idContact;
            var contact = (Contact)db.Query<Contact>(query, new { id = id }).SingleOrDefault();
            if (contact == null)
            {
                Console.WriteLine("No Result!");
                return null;
            }
            Console.WriteLine(contact.ToString());
            return contact;
        }
    • Ví dụ 4 – Xóa Contact
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void DeleteContact()
{
    try
    {
        Console.WriteLine("Enter Name: ");
        int id = Convert.ToInt32(Console.ReadLine());
        var contact = Find(id);
        string query = "delete contacts where id = @id";
        db.Execute(query, new { id = id });
        Console.WriteLine("Deleted: {0}", contact.ToString());
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
    • Ví dụ 5 – Update Contact
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static void UpdateContact()
{
    try
    {
        Console.WriteLine("Enter Contact Id: ");
        int id = Convert.ToInt32(Console.ReadLine());
        var contact = Find(id);
        Console.WriteLine("Enter Name: ");
        contact.Name = Console.ReadLine();
        Console.WriteLine("Enter Phone: ");
        contact.Phone = Console.ReadLine();
        var param = new DynamicParameters();
        param.Add("Id", contact.Id);
        param.Add("Name", contact.Name);
        param.Add("Phone", contact.Phone);
        string query = "update contacts set Name = @Name, Phone = @Phone where Id = @Id";
        db.Execute(query, param);
        Console.WriteLine("Updated");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
    • Ví dụ 6 – Thêm mới Contact thông qua Procedure

Procedure:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
USE [dapper]
GO
/****** Object:  StoredProcedure [dbo].[SaveContact]    Script Date: 10/30/2015 11:11:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[SaveContact]
@id int output,
@Name nvarchar(50),
@Phone nvarchar(50)
as
begin
insert into contacts(name, phone) values(@Name, @Phone);
set @id = cast(SCOPE_IDENTITY() as int)
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void AddContactUseProcedure()
{
    try
    {
        var contact = new Contact();
        Console.WriteLine("Enter Name: ");
        contact.Name = Console.ReadLine();
        Console.WriteLine("Enter Phone: ");
        contact.Phone = Console.ReadLine();
        var param = new DynamicParameters();
        param.Add("@Id", contact.Id, DbType.Int32, direction: ParameterDirection.InputOutput);
        param.Add("Name", contact.Name);
        param.Add("Phone", contact.Phone);
        db.Execute("SaveContact", param, commandType: CommandType.StoredProcedure);
        contact.Id = param.Get<int>("@Id");
        Console.WriteLine("Added: {0}", contact.ToString());
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
    • Ví dụ 7 – Lấy dữ liệu từ nhiều bảng
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void GetMultipleDataTable()
        {
            try
            {
                string query = "select * from Contacts where id = @id; select * from Address where ContactId = @id";
                Console.WriteLine("Enter contact ID: ");
                int id = (Convert.ToInt32(Console.ReadLine()));
                using (var multipleData = db.QueryMultiple(query, new { id = id }))
                {
                    var contact = multipleData.Read<Contact>().SingleOrDefault();
                    var address = multipleData.Read
<Address>().ToList();
                    if (contact != null && address != null)
                    {
                        contact.Addresss.AddRange(address);
                    }
                    Console.WriteLine(contact.ToString());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    • Ví dụ 8 – Lấy dữ liệu từ nhiều bảng thông qua Procedure

Procedure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
USE [dapper]
GO
/****** Object:  StoredProcedure [dbo].[get_contact_address]    Script Date: 10/30/2015 11:22:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[get_contact_address]
@id int
as
begin
select * from Contacts where id = @id
select * from [Address] where ContactId = @id
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        static void GetMultipleDataTableUseProcedure()
        {
            try
            {
                Console.WriteLine("Enter contact ID: ");
                int id = (Convert.ToInt32(Console.ReadLine()));
                using (var multipleData = db.QueryMultiple("get_contact_address", new { id = id }, commandType: CommandType.StoredProcedure))
                {
                    var contact = multipleData.Read<Contact>().SingleOrDefault();
                    var address = multipleData.Read
<Address>().ToList();
                    if (contact != null && address != null)
                    {
                        contact.Addresss.AddRange(address);
                    }
                    Console.WriteLine(contact.ToString());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

Chạy chương trình

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main(string[] args)
        {
            try
            {
                db.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                //Find();
                //Add();
                //GetMultipleDataTable();
                //GetMultipleDataTableUseProcedure();
                //AddContactUseProcedure();
                //DeleteContact();
                //UpdateContact();
            }
            Console.ReadKey();
        }

Tham khảo: https://1newworld.wordpress.com/2015/10/28/gioi-thieu-micro-orm-dapper-c-net/comment-page-1/

Leave a Reply

Your email address will not be published. Required fields are marked *