Tags:

พอมีวิธี map object จาก entity ไปยัง presentation ไหมครับ
ตัวอย่างเช่น เรา generate models ออกมาจาก database โดยใช้ Scaffold-DbContext แล้วได้ models ออกมา 1 model สมมติว่าเป็น Person ซึ่งมี properties เป็น Name,Surname,Gender,Email,Phone
แต่ทีนี้เมื่อเราต้องการนำไปใช้งานเราต้องการแค่ Name และ Surname ตอนนี้ที่ทำคือ สร้าง Object PresentPerson ที่มี properties แค่ Name และ Surname อยู่ในนั้นโดยเมื่อ query ข้อมูล Person ขึ้นมาจะทำการสร้าง Object PresentPerson แล้ว map แต่ละ Properties ตรงๆ เช่น PresentPerson.Name = Person.Name,PresentPerson.Surname = Person.Surname แล้วก็ส่ง PresentPerson Object ออกไป
ขากลับใช้ วิธีเอา key ไปหา Person object ออกมาแล้วกำหนด Properties แต่ละอัน map กับ PresentPerson ที่รับเข้ามา
ประเด็นคือเมื่อ properties มีการเปลี่ยนแปลงหลายครั้ง เราต้องมานั่ง Set แต่ละ properties เข้าไปซึ่งถ้ามี หลายจุดใน code ทำให้อาจมีหลุดไปหรือผิดไป ทีนี้พอจะมีวิธีที่ query Person object มาแล้วนำมา Cast หรือ bind กับ PresentPerson object ได้เลยโดยสามารถรู้ properties ที่ต้องการ map ได้เลย เช่น PresentPerson = Person โดยเมื่อ PresentPerson มี property Gender เข้ามา เวลา map Person ก็จะนำ Gender มา bind กับ PresentPerson ที่มี properties name ตรงกันโดยอัตโนมัติ

** พอดีถามไว้หลายแหล่ง ได้คำแนะนำมาว่าให้ใช้ Automapper กับ Dapper ครับ แต่ถ้าใครมีเทคนิคอะไรแนะนำกันได้นะครับ ขอบคุณครับ

Get latest news from Blognone
By: akira on 15 October 2018 - 20:27 #1076326

ผมใช้ Code First กับ Entity Framework ไม่เคยเจอปัญหาอย่างนี้นะ ผมใช้ EF ทำ Model แล้วใช้ Repository คุมข้อมูล ส่งให้ Controller ทำเป็น WebAPI ออกไปให้ UI ที่เขียนด้วย Angular หรือ Bootstrap ส่วนตัวผมว่ายืดหยุ่นกว่าพวก Database First

แต่เวลาออก Report ผมจะใช้ Model First เพราะมันเปลี่ยนบ่อย ขี้เกี่ยจแก้ Code เคยใช้ Database First อยู่ทีครั้งนึง แล้วตั้งค่าผิด มันเคลียร์ข้อมูล Master ทิ้ง ก็เลยไม่ค่อยใช้เพราะผมเป็นพวกขี้ลืม

By: waroonh
Windows
on 16 October 2018 - 08:01 #1076395

Database first +
Automap
No short cut นะครับ เขียนเถอะ พอซับซ้อนขึ้น ก็จะรู้เองว่ามาถูกทางแล้ว

By: easyearth on 19 October 2018 - 14:27 #1077231

ใช้วิธีสร้าง partial class ดูหรือยังครับ

By: fantast
Windows Phone
on 22 October 2018 - 20:23 #1077692
fantast's picture

ตอนแปลง Person เป็น PresentPerson นี่ได้หลายทางครับ เขียนเป็น Extension ก็ได้ครับ เช่น .ToPresentPerson()

หรือตอนเขียน LINQ ตอน Select ออกเขียน new Object ใหม่ก็ได้ครับ ยกตัวอย่าง

from p in db.Persons // Object Person
select new PresentPerson()
{
Name = p.Name,
Surname = p.Surname
}

แต่ตอนแปลงกลับนี่มีปัญหาแน่นอน ต้อง select ใหม่ครับ เอา Id ของ PresentPerson ไป select เอา Person แบบนี้ครับ