เปรียบเทียบให้เห็นกันชัดๆ ระหว่างเขียน code แบบ raw SQL statement และ ORM เพื่อใช้ในการจัดการกับฐานข้อมูล

enter image description here

ในตัวอย่างนี้ เราจะมาลองเขียน C# code แบบง่ายๆ โดยเป็น code ทีใช้ใน note application ถ้าใครนึกภาพไม่ออก ก็ให้คิดว่าเป็น app แนวๆ เดียวกับ Evernote หรือ OneNote ครับ ซึ่งชื่อ fields สามารถ custom ได้ และ NoteTags table ถูกสร้างให้โดยอัตโนมัติเพื่อเชื่อมโยงความสัมพันธ์แบบ many to many ของ table Notes และ Tags

ตัว model class หลักๆ ของ note application ก็จะมีดังนี้ครับ

  • Note คือ class หลักที่เราเก็บบันทึกชื่อและเนื้อหาที่เราจะจดบันทึก
  • Notebook เปรียบหมือน folder หรือสมุดที่บันทึก Note ดังนั้นในหนึ่ง notebookจะมีหลาย note แต่หนึ่ง note จะอยู่ภายใต้หนึ่ง notebook เท่านั้น
  • Tag คือ tag ของ Note หนึ่ง note จะได้มีได้หลาย tag และหนึ่ง tag ก็จะมีได้หลาย note เป็นความสำพันธ์แบบ many to many

ER Diagram

ตัวอย่าง ER Diagram เพื่อให้เห็นภาพความสัมพันธ์นะครับผม table ทั้งหมดถูกสร้างขึ้นมาตอน initial EF db context ครับ

enter image description here

มาดูตัวอย่าง code กัน การจะสร้าง Note object ใหม่ขึ้นมาได้ เราต้องสร้าง Notebook ขึ้นมาก่อน ซึ่งก็คือการสร้าง container หรือ parent นั่นเองให้กับ Note นั่นเอง ดังนั้น เราจะเริ่มด้วยการเขียน code เพื่อสร้าง Notebook และจัดเก็บลง database ก่อน

ในตัวอย่างนี้ ผมจะสร้าง Notebook ที่ชื่อว่า programming Tip ไว้เก็บ note ต่างๆ ที่เกี่ยวกับ programming ครับ

มาลองเขียน insert Notebook ใหม่ลงไปในฐานข้อมูลด้วย SQL Insert statement และ C# ADO.NET กัน

Insert a new record with raw SQL insert statement (ADO.NET)

// Traditional SQL insert with ADO.NET
var connectionString = ConfigurationManager.ConnectionStrings["NoteConnectionString"].ConnectionString;
using (var connection = new SqlConnection(connectionString))
{
    //Prepare SQL command
    var command = connection.CreateCommand();
    command.CommandText = "INSERT INTO Notebooks VALUES (@name)"; //Magic string

    //Prepare SQL parameter prevent SQL Injection
    const string notebookName = "Programming Tips";
    var parameter = new SqlParameter()
    {
        ParameterName = "name",
        Value = notebookName,
        DbType = DbType.String
    };
    command.Parameters.Add(parameter);

    //Start execute query to a database server
    connection.Open();
    var rowsEffected = command.ExecuteNonQuery();
    System.Console.WriteLine($"New notebook inserted with rows effected {rowsEffected}");
}

มาลองเขียน code อีกแบบผ่านสิ่งที่เรียกว่า Object-Relational mapping เรียกย่อๆ ว่า ORM ซึ่งเป็นวิธีการการ map ข้อมูลในรูปแบบตารางฐานข้อมูล ให้มาอยู่ในรูปแบบ object-oriented programming เมื่อจะจัดการกับข้อมูล เราก็ทำผ่าน class ที่ map กับตารางในฐานข้อมูล โดยที่เราไม่ต้องเขียน SQL statement ใดๆ เลย

ในตัวอย่างนี้เราได้สร้าง class Notebook ซึ่ง map กับ table Notebook ไว้ก่อนแล้ว และ Entity Framework เป็น ORM สำหรับใช้ใน .NET Application ตัวอย่าง ORM framework ของภาษาอื่น ๆ เช่น Hibernate สำหรับ Java และ Doctrine สำหรับ PHP

ตัวอย่างการสร้าง Notebook ใหม่ให้ผลลัพธ์แบบเดียวกับตัวอย่าง code ที่ผ่านมา แต่เขียนด้วย Entity Framework และ ORM

Insert a new record with ORM (Entity Framework)

// Insert with Entity Framework
using (var dbContext = new NoteDbContext())
{
    var notebook = new Notebook()
    {
        Name = "Programming Tips"
    };

    dbContext.Notebooks.Add(notebook);
    dbContext.SaveChanges();

    System.Console.WriteLine($"New notebook inserted with Id {notebook.Id}");
}

ข้อดีและข้อเสีย raw SQL และ ORM (Entity Framework) เนื่องจาก editor ที่ผมใช้ในเว็บยังไม่ support markdown table จึงขอใช้เป็นรูปภาพ พร้อม link ไปยัง Google doc ก่อนนะครับผม

Link to comparison table in Google Doc

enter image description here

source code ตัวอย่างที่ github https://github.com/codesanook/Codesanook.EFNote

!!! สำคัญมาก !!!

ต้องเข้าใจก่อนว่า ORM ไม่ได้มีแต่ข้อดีเพียงอย่างเดียว ORM ก็มีข้อเสียเช่นกัน หากใช้ไม่ถูกวิธี แต่ก็มีวิถึแก้ครับ ที่สำคัญคือความเข้าใจ และใช้งานให้ถูกต้องกับสถานการณ์ เรื่องนี้จะอธิบายในบทความต่อๆ ไปนะครับ ฝากติดตามด้วยนะครับผม

สำหรับผู้ที่สนใจเรียนรู้ ORM Entity Framework แบบเข้าใจ และใช้งานได้จริง

ถ้าสนใจเรียนรู้เรื่อง ORM ด้วย Entity Framework ด้วย C# แบบเข้าใจ และนำไปใช้งานจริงได้ ตอนนี้นี้เรามี course "จาก SQL สู่ query แบบ OOP ด้วย Entity Framework และการประยุกต์ใช้ใน ASP.NET MVC/MVC Core"

วัน เวลา สถานที่

วันเสาร์และอาทิตย์ที่ 28, 29 ก.ย. เวลา 9.00 - 18.00 น. ComSci Cafe ติด BTS Bearing

course นี้เหมาะกับใคร

ผู้ที่มีพื้นฐาน C#, Database เช่น MySQL, SQL Server ต้องการเรียนรู้ Entity Framework ORM เพื่อใช้จัดการฐานข้อมูลใน .NET application

ผู้สอน: Theeranit Pongtongmuang (Aaron Amm)

  • Senior software engineer Jetabroad (Thailand) Co., Ltd.
  • Admin Codesanook.com page (More than 9K facebook likes)
  • Programming experiences more than 10 years

Certificates:

  • Microsoft Certificate Trainer (MCT) Microsoft Certificate
  • Professional Developer (ASP.NET Developer) Microsoft Certificate
  • Technology Specialist (.NET Framework, ADO.NET Applications)
  • Microsoft Certificate Technology Specialist (.NET Framework, ASP.NET Applications)

course outline

สามารถสมัครลงเรียนตาม link นี้ได้เลยครับผม

สมัครเรียน Entity Framework กับ codesanook

enter image description here