Entity & Relation (Foreign Key , CasCade , Delete , Update) (LINQ, Entity Framework) |
Entity & Relation (Foreign Key , CasCade , Delete , Update) (LINQ, Entity Framework) ในการใช้ Entity Framework สามารถอ้างถึง Table และ Attribute Field ใน Table ชนิดของ Data Type ได้อย่างถูกต้อง ไม่มีปัญหาเรื่องชื่อ Table หรือ Field ผิดแน่นอน ลดปัญหาการ Insert ข้อมูลหรือพวก SQL Injection , ค่า Null , DBNull , Data Type ซึ่งเป็นปัญหาเก่า ๆ จะไม่เป็นปัญหาอีกต่อไป ประเด็นสำคัญของ Entity Framework คือ มันค่อนข้างจะให้ความสำคัญของ Key และ Relation ของ Table อย่างมาก โดยเฉพาะ Primary Key ถ้า Project ของเราขาดตัวนี้ ก็แนะนำให้หลีกเลี่ยงการใช้ Entity Framework เพราะจะต้องไปจัดการเพิ่ม Key ใน EntitySet ก่อนที่จะใช้งาน ส่วนประเด็นของ Relation ของ Table อันนี้ไม่จำเป็นต้องใช้ก็ได้ แต่ถ้า Table ของเราทำการภูก Relation ไว้แล้วการใช้ Entity Framework จะมีความมหัสจรรย์ยิ่งขึ้น เช่น เราสามารถดึงข้อมูลของ Table พร้อมทั้งข้อมูลที่ Relation ของ Table ที่เกี่ยวข้องออกมาได้ด้วยการเลือกข้อมูลครั้งเดียว โดยที่ไม่ต้องมาทำการ Join Table แต่อย่างใด ยกตัวอย่างขอมูลของ ลูกค้า กับ รายการสั่งซื้อ เราเพียงแค่ Select ข้อมูลลองลูกค้าตาม รหัสูลูค้า หลังจากนั้นข้อมูลพวก Order ต่าง ๆ จะขึ้นมาให้เราอัโตนมัติ สามารถเรียกใช้ได้ทันที โดยไม่ต้องไป Select เพิ่มอีก และยังมีความสามารถในการทำ Cascade พวก Insert , update และ delete แต่ในทางปฏิบัติแล้วการออกแบบ Table ให้มี Relation ถูกต้องเปะ ๆ แทบจะเป็นไปไม่ได้เลย ฉะนั้นทางเลือกของ Relation Table ผมจะไม่ค่อยให้ความสำคัญเท่าไหร่ เพราะสามาาถไปจัดการได้ที่การ Join ข้อมูลแทน
การสร้าง Relation บน SQL Server Database
คลิกเลือกที่ New Database Diagram
เลือก Table ที่ต้องการ
ในส่วนของ Diagram ให้เราทำการลากเพื่อเชื่อมความสัมพันธ์ของ Table
ตัวอย่างการกำหนด Relation ของ Table ในตัวอย่างนี้ระหว่าตาราง CUSTOMER กับ AUDIT เชื่อมโดยใช้ CUSTOMER_ID ความสัมพันธ์เป็นแบบ 1 ต่อ กลุ่ม คือ 1 ลูกค้า มีได้หลาน Audit
สามารถกำหนด Cascade ของ Relation เช่น ถ้า Delete ที่เป็น Key ให้ข้อมูลที่เกี่ยวข้องของตารางถูกลบไปด้วย หรือในกรณีที่ Update ที่เป็น Key ก็ให้มีการเปลี่ยนแปลงค่าใน Table อื่น ๆ ที่เกี่ยวข้องด้วย
เชื่อม Relation ให้ครบ
เลือก Save ตัว Diagram ที่เราได้สร้างไว้
Diagram ที่ได้
กลับมายัง Model Entities บน Visual Studio
ให้คลิกขวาเลือก Update Model from Database
ถ้าเป็นการ Update ตัว Relation สามารถเลือก Update ได้เลย โดยไม่ต้องเลือกรายการอื่น ๆ
หลังจากนั้นจะเห็นว่าบน Model Entities จะมีความสัมพันธ์ของแต่ล่ะ EntitySet และในแต่ล่ะ EntitySet จะมีรายการ Table ที่เป็น Relation แสดงออกมาด้วย เช่น CUSTOMER จะมี AUDIT และ COUNTRY นั่นหมายถึงว่าในการ Select ข้อมูลจาก CUSTOMER จะสามารถแสดงรายการของ Table จาก AUDIT และ COUNTRY ได้เลย โดยการ Select เพียงครั้งเดียว
ในการ Select ข้อมูลเช่น CUSTOMER จะสามารถเลือกรายการ COUNTRY_NAME ที่อยู่ในอีก Table ที่เป็น Relation ได้เลย โดยไม่ต้องทำการ JOIN ข้อมูลระหว่าง 2 Table นี้
ในการเขียน LINQ to Entities จะสามารถอ้างถึงรายการ EntitySet ที่เกี่ยวข้องที่เป็น Relation
จะเห็นว่า Entity จะมีการแสดงข้อมูลและ Column ที่เป็น Relation ให้อัตโนมัติ ซึ่งสะดวกมาก ๆ
Example 1 : การ Select ข้อมูลจาก CUSTOMER แต่มีการดึง COUNTRY_NAME ของอีกตาราง
สร้าง DataGridView สำหรับแสดงข้อมูล
Code (C#)
private void frmMain_Load(object sender, EventArgs e)
{
// Create new entities Object
using (var db = new myDatabaseEntities())
{
// Get data from CUSTOMER
var ds = (from c in db.CUSTOMER
select new
{
CusID = c.CUSTOMER_ID,
CusName = c.NAME,
CusCountryName = c.COUNTRY.COUNTRY_NAME,
}).ToList();
// Assign to DataGridView
if (ds.Count() > 0)
{
this.myDataGridView.DataSource = ds;
}
}
}
Code (VB.Net)
Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Create new entities Object
Using db = New myDatabaseEntities()
' Get data from CUSTOMER
Dim ds = (From c In db.CUSTOMER Select New With { _
.CusID = c.CUSTOMER_ID, _
.CusName = c.NAME, _
.CusCountryName = c.COUNTRY.COUNTRY_NAME _
}).ToList()
' Assign to DataGridView
If ds.Count() > 0 Then
Me.myDataGridView.DataSource = ds
End If
End Using
End Sub
Screenshot
Example 2 : การ Select ข้อมูลจาก CUSTOMER และแสดงรายการจากตาราง AUDIT
สร้าง DataGridView และ Label ดังรูป
Code (C#)
private void frmMain_Load(object sender, EventArgs e)
{
// Create new entities Object
using (var db = new myDatabaseEntities())
{
// CustomerID C001
string strCustomerID = "C001";
// Get data from CUSTOMER
var cus = (from c in db.CUSTOMER
where c.CUSTOMER_ID == strCustomerID
select c).FirstOrDefault();
// if found item rows
if (cus != null)
{
// Result 1 and 2
this.lblResult1.Text = string.Format("Customer ID : {0}", cus.CUSTOMER_ID); // Get CustomerID
this.lblResult2.Text = string.Format("Country : {0}", cus.COUNTRY.COUNTRY_NAME); // Get Country Name
// Get Audit
var audit = (from c in cus.AUDIT
select new
{
c.AUDIT_ID,
c.LOG_DATE,
c.USED,
}).ToList();
// Assign to DataGridView
if (audit.Count() > 0)
{
this.myDataGridView.DataSource = audit;
}
}
}
}
Code (VB.Net)
Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Create new entities Object
Using db = New myDatabaseEntities()
' CustomerID C001
Dim strCustomerID As String = "C001"
' Get data from CUSTOMER
Dim cus = (From c In db.CUSTOMER
Where c.CUSTOMER_ID = strCustomerID Select c).FirstOrDefault()
' if found item rows
If cus IsNot Nothing Then
' Result 1 and 2
Me.lblResult1.Text = String.Format("Customer ID : {0}", cus.CUSTOMER_ID)
' Get CustomerID
Me.lblResult2.Text = String.Format("Country : {0}", cus.COUNTRY.COUNTRY_NAME)
' Get Country Name
' Get Audit
Dim audit = (From c In cus.AUDIT Select New With { _
c.AUDIT_ID, _
c.LOG_DATE, _
c.USED _
}).ToList()
' Assign to DataGridView
If AUDIT.Count() > 0 Then
Me.myDataGridView.DataSource = AUDIT
End If
End If
End Using
End Sub
Screenshot
|
ช่วยกันสนับสนุนรักษาเว็บไซต์ความรู้แห่งนี้ไว้ด้วยการสนับสนุน Source Code 2.0 ของทีมงานไทยครีเอท
|
|
|
By : |
ThaiCreate.Com Team (บทความเป็นลิขสิทธิ์ของเว็บไทยครีเอทห้ามนำเผยแพร่ ณ เว็บไซต์อื่น ๆ) |
|
Score Rating : |
|
|
|
Create/Update Date : |
2015-10-02 21:14:51 /
2017-03-15 14:53:32 |
|
Download : |
No files |
|
Sponsored Links / Related |
|
|
|
|
|
|
|