Oracle with .Net Core

เนื่องจากโปรเจคใช้เป็น .Net Core และตัว Database เองก็อยากจะเปลี่ยนเป็น Oracle ซึ่งตัวที่ใช้เป็นตัวกลางสำหรับการทำงานก็คือ Entity Framework แต่… ปัญหามันก็เกิดขึ้นตรงที่… EF Core ดันยังไม่มีตัวที่รองรับการใช้งาน Oracle แบบเป็นทางการเลย….
แล้วทีนี้เราจะทำยังไงดีละ….

ก็เลยลองไปหาดู Package ของ Oracle บน Nuget ก็พบว่ามันมี Oracle Provider ที่เป็นของ Official อยู่นะ และที่สำคัญคือพ้นสภาพของ Beta แล้วนะ และเป็น version 2.18.3 สามารถเข้าไปดูรายละเอียดบน Nuget ได้ที่นี่ https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/

Oracle Managed Data Access For .Net Core On Nuget

ต่อจากนั้นก็เข้าไปดูโปรเจคของ Microsoft บน Github กันก่อน เผื่อว่าจะมีเครื่องมืออะไรของ EF ที่สามารถเอามาใช้งานได้ ซึ่งทางเข้าก็ ตามลิงค์นี้ https://github.com/aspnet/EntityFrameworkCore

Microsoft Entity Framework On Github

และสำหรับภายในโปรเจคก็จะมีตัว Samples Project แต่ว่าผมเจอเข้ากับโปรเจคอยู่ตัวหนึ่ง ซึ่งเป็นอะไรที่ตรงกับความต้องการมากที่สุดนั้นก็คือ…

Oracle Provider Sample Project

เอาละได้เวลาโหลดมาลองเล่นกันดีกว่า…. สำหรับ Branch ที่ผม Pull ลงมาจะเป็น 2.1.3 ซึ่งจะเป็น Version เดียวกับ Microsoft.AspNetCore.Identity ครับ และเมื่อเปิดโปรเจคขึ้นมาสำรวจก็จะเจอกับโครงสร้างโปรเจคแบบนี้

EF Core Project structure

จากนั้นผมจะสนใจแค่ตัวโปรเจค OracleProvider เพียงอย่างเดียว เพราะว่าเป็นตัวที่จะเอาไปใช้งาน

** สำหรับโปรเจคตัวนี้ยังไม่ได้อยู่ในขั้น Production นะครับ อาจจะมีบั๊คอยู่นะครับ เพราะงั้นก่อนเอาไปใช้งานต้องลองทดสอบกันก่อนนะครับ

ขั้นแรกก็เข้าไปดู Package ที่ถูก Import เข้ามาในโปรเจคกันก่อนว่าตัวโปรเจคใช้งาน Oracle ตัวไหนอยู่

Nuget Package for Oracle Provider

อ้าวดันเป็น Provider ของฝั่ง .Net Framework ซะงั้น ถ้าเอาไปใช้งานเลยอาจจะมีปัญหาได้ เพราะว่าตัว Library บางตัวไม่รองกับกับ .Net Core ทำให้ไม่สามารถเอาไปใช้งานได้ครับ ดังนั้นเราก็ต้องมาเปลี่ยนกันก่อน โดยลบ Oracle.ManagedDataAccess ตัวเก่าออกไปก่อนแล้วก็ Import ตัว Oracle.ManagedDataAccess.Core เข้ามาแทนที่

Oracle Provider for .Net Core installed

จากนั้นก็ลอง Compile เพื่อดูผลว่าสามารถใช้งานได้หรือไม่ จริงๆ จะไปใช้ Unit Test ของตัวโปรเจคก็ได้ครับ แต่ว่าของผมจะทำการ Release แล้วเอาไปทดสอบใน Project ดูว่าสามารถทำงานได้หรือไม่นะครับ

** ตัวโปรเจคจะแจ้ง Error ว่าหา Microsoft.DotNet.GlobalTools.SDK ไม่เจอก็ไม่ต้องสนใจครับ

แล้วก็ไปกำหนดค่าการ Release ตรงส่วนของ Debug ตามภาพ

Compile โปรเจคอีกรอบหรือจะคลิกขวาที่โปรเจคแล้วเลือกคำสั่ง Pack ก็จะสามารถเอา Library ไปใช้งานได้แล้วครับ

โดยไฟล์ที่เราจะเอามาใช้งานจะถูกวางเอาไว้ในโฟลเดอร์ Release ใน bin และตัวไฟล์ที่เราต้องการจะมี 3 ไฟล์ ดังภาพ

จากนั้นมาทดสอบโปรเจคกันดีกว่าครับ โดยผมจะสร้างโปรเจคของ .Net Core แบบ Console ขึ้นมา โดยจะตั้งชื่อว่า HelloOracle ดังภาพ

จากนั้นก็ทำการเพิ่ม Entity Framework Core ผ่าน Nuget และ Import ตัว library ที่พึ่ง Pack เสร็จเข้ามา ดังภาพ

จากนั้นเราก็จะมาเริ่มเขียนโค๊ดกันครับ โดยผมจะสร้าง Class ขึ้นมา 1 ตัว ชื่อว่า Employee โดยจะมีรายละเอียดตามนี้ครับ

public class Employee{    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public string Firstname { get; set; } [DataType(DataType.EmailAddress)]
public string Email { get; set; }
[DataType(DataType.Date)]
public DateTime SignUp { get; set; }
}

จากนั้นก็มาสร้าง DbContext กันต่อ โดยเราจะกำหนดตัว Connection string ให้ชี้ไปยังตัว Oracleในส่วนของ OnConfig กันดังนี้ครับ

public class ApplicationDbContext : DbContext{    public DbSet<Employee> Employees { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseOracle("User Id = DemoUser; Password = Passw0rd; Data Source = 127.0.0.1:1521/ORCL");
}
}

จากนั้นก็ทำการเรียกใช้งาน ApplicationDbContext ใน Main กันดังนี้ครับ

public class Program
{
public static void Main(string[] args)
{
using (var context = new ApplicationDbContext())
{
Console.WriteLine("Hello");
}
Console.Read();
}
}

แล้วก็ Complile โปรเจคสักครั้งหนึ่งเพื่อที่จะลอง Migration กันครับ โดยหลังจากที่ Compile ตัวโปรเจคกันแล้ว ซึ่งเราสามารถทำได้ 2 วิธี โดยจากตัว
Nuget Console และ Dotnet CLI

สำหรับคำสั่งที่ใช้ Nuget ผมจะใช้ PM> และถ้าจาก Dotnet CLI ผมจะขอใช้ $> นะครับ

เริ่มแรกเราก็จะใช้คำสั่งนี้เพื่อสร้างชุดโค๊ดสำหรับ Migration กันครับ

PM> add-migration InitialDataBase
$> dotnet ef migrations add InitialDataBase

หากสังเกตุในส่วนของ Solution จะมีโฟล์เดอร์เพิ่มขึ้นมา ดังภาพ

จากนั้นเราจะใช้คำสั่งนี้ เพื่อทำการ migration หรือ update database กัน

PM> update-database
$> dotnet ef database update

หลังจากที่ update database เสร็จแล้ว เมื่อเข้าไปดูใน Oracle ก็จะมี Table Employee ดังภาพ

จากนั้นเราจะมาลองทดสอบ Insert ข้อมูล ผ่านโปรเจคกันด้วยการเพิ่มคำสั่งนี้เข้าไปในส่วนของการเรียกใช้ ApplicationDbContext ต่อจากข้างบน

var employee = new Employee
{
Firstname = "Vatthanachai",
Email = "vatthanachai.w@gmail.com",
SignUp = new DateTime(2011, 10, 14)
};
context.Employees.Add(employee);
context.SaveChanges();

แล้วจากนั้นทดสอบโดยการรันโปรเจคแล้วเข้าไปดูข้อมูลใน Table ก็จะมีข้อมูลที่เราเพิ่มเข้าไป ดังภาพ

และสำหรับการดึงข้อมูลและแก้ไขข้อมูลผมก็จะเพิ่มคำสั่งนี้เข้าไป

var emp = context.Employees.SingleOrDefault(s => s.Email == "vatthanachai.w@gmail.com");if (emp != null)
{
emp.Firstname = "Vatthanachai Wongprasert";
emp.SignUp = new DateTime(2015, 6, 11);
context.Update(emp);
context.SaveChanges();
}

จากนั้นรันโปรแกรมแล้วเข้าไปดูข้อมูลใน Table ซึ่งข้อมูลก็จะถูกแก้ไข ดังภาพ

และสำหรับการลบข้อมูล ผมจะเปลี่ยนคำสั่ง จาก update เป็น Remove แทน

var emp = context.Employees.SingleOrDefault(s => s.Email == "vatthanachai.w@gmail.com");if (emp != null)
{
context.Remove(emp);
context.SaveChanges();
}

จากนั้นรันโปรแกรมแล้วเข้าไปดูข้อมูลใน Table ก็จะถูกลบออกไป ดังภาพ

สำหรับบทความนี้ก็ขอจบแบบสั้นๆ เพียงแค่นี้ครับ หวังว่าพอจะมีประโยชน์กันนะครับ
ขอบคุณที่ติดตามอ่านกันครับ

Source Code >> https://github.com/VatthanachaiW/HelloOracle

--

--