Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Anda dapat menyandikan sebagai referensi properti di kelas entitas Anda pada hubungan data apa pun yang akan selalu sama. Dalam database sampel Northwind misalnya, karena pelanggan biasanya memesan, selalu ada hubungan dalam model antara pelanggan dan pesanan mereka.
LINQ to SQL mendefinisikan atribut AssociationAttribute untuk membantu merepresentasikan hubungan semacam itu. Atribut ini digunakan bersama dengan jenis EntitySet<TEntity> dan EntityRef<TEntity> untuk mewakili apa yang akan menjadi hubungan kunci asing dalam database. Untuk informasi selengkapnya, lihat bagian Atribut Asosiasi dari Pemetaan Berbasis Atribut.
Catatan
Nilai properti Penyimpanan AssociationAttribute dan ColumnAttribute peka terhadap huruf besar/kecil. Misalnya, pastikan bahwa nilai yang digunakan dalam atribut untuk properti AssociationAttribute.Storage cocok dengan nama properti terkait yang digunakan di tempat lain dalam kode. Ini berlaku untuk semua bahasa pemrograman .NET, bahkan yang biasanya tidak peka huruf besar/kecil, termasuk Visual Basic. Untuk informasi selengkapnya tentang properti Penyimpanan, lihat DataAttribute.Storage.
Sebagian besar hubungan adalah satu-ke-banyak, seperti dalam contoh pada bagian nanti dalam topik ini. Anda juga dapat merepresentasikan hubungan satu-ke-satu dan banyak-ke-banyak sebagai berikut:
Satu-ke-satu: Mewakili hubungan semacam ini dengan menyertakan EntitySet<TEntity> di kedua sisi.
Misalnya, pertimbangkan hubungan
Customer-SecurityCode, yang dibuat sehingga kode keamanan pelanggan tidak akan ditemukan di tabelCustomerdan hanya dapat diakses oleh orang yang berwenang.Banyak-ke-banyak: Dalam hubungan banyak-ke-banyak, kunci utama tabel tautan (juga disebut tabel persimpangan) sering kali dibentuk oleh gabungan kunci asing dari dua tabel lainnya.
Misalnya, pertimbangkan
Employee-Projecthubungan banyak ke banyak yang dibentuk dengan menggunakan tabel tautanEmployeeProject. LINQ to SQL mengharuskan hubungan seperti itu dimodelkan dengan menggunakan tiga kelas:Employee,Project, danEmployeeProject. Dalam hal ini, mengubah hubungan antaraEmployeedanProjecttampaknya memerlukan pembaruan kunci utamaEmployeeProject. Namun, situasi ini paling baik dimodelkan dengan menghapusEmployeeProjectyang ada dan membuatEmployeeProjectbaru.Catatan
Hubungan dalam database relasional biasanya dimodelkan sebagai nilai kunci asing yang merujuk ke kunci utama di tabel lain. Untuk menavigasi di antara keduanya, Anda secara eksplisit mengaitkan dua tabel dengan menggunakan operasi gabung relasional.
Objek di LINQ to SQL, di sisi lain, merujuk satu sama lain dengan menggunakan referensi properti atau kumpulan referensi yang Anda navigasikan dengan menggunakan notasi titik.
Contoh 1
Dalam contoh satu-ke-banyak berikut, kelas Customer memiliki properti yang menyatakan hubungan antara pelanggan dan pesanan mereka. Properti Orders berjenis EntitySet<TEntity>. Jenis ini menandakan bahwa hubungan ini adalah satu ke banyak (satu pelanggan dengan banyak pesanan). Properti OtherKey digunakan untuk menjelaskan cara asosiasi ini dilakukan, yaitu dengan menetapkan nama properti di kelas terkait untuk dibandingkan dengan yang satu ini. Dalam contoh ini, properti CustomerID dibandingkan, seperti halnya database gabung akan membandingkan nilai kolom tersebut.
Catatan
Jika Anda menggunakan Visual Studio, Anda bisa menggunakan Object Relational Designer untuk membuat asosiasi antar kelas.
[Table(Name = "Customers")]
public partial class Customer
{
[Column(IsPrimaryKey = true)]
public string CustomerID;
// ...
private EntitySet<Order> _Orders;
[Association(Storage = "_Orders", OtherKey = "CustomerID")]
public EntitySet<Order> Orders
{
get { return this._Orders; }
set { this._Orders.Assign(value); }
}
}
<Table(Name:="Customers")> _
Public Class Customer
<Column(IsPrimaryKey:=True)> _
Public CustomerID As String
' ...
Private _Orders As EntitySet(Of Order)
<Association(Storage:="_Orders", OtherKey:="CustomerID")> _
Public Property Orders() As EntitySet(Of Order)
Get
Return Me._Orders
End Get
Set(ByVal value As EntitySet(Of Order))
Me._Orders.Assign(value)
End Set
End Property
End Class
Contoh 2
Anda juga dapat membalikkan situasi. Alih-alih menggunakan kelas Customer untuk menjelaskan hubungan antara pelanggan dan pesanan, Anda dapat menggunakan kelas Order. Kelas Order menggunakan jenis EntityRef<TEntity> untuk menjelaskan hubungan kembali ke pelanggan, seperti pada contoh kode berikut.
Catatan
Kelas EntityRef<TEntity> mendukung pemuatan yang ditangguhkan. Untuk informasi selengkapnya, lihat Ditangguhkan versus Pemuatan Segera.
[Table(Name = "Orders")]
public class Order
{
[Column(IsPrimaryKey = true)]
public int OrderID;
[Column]
public string CustomerID;
private EntityRef<Customer> _Customer;
[Association(Storage = "_Customer", ThisKey = "CustomerID")]
public Customer Customer
{
get { return this._Customer.Entity; }
set { this._Customer.Entity = value; }
}
}
<Table(Name:="Orders")> _
Public Class Order
<Column(IsPrimaryKey:=True)> _
Public OrderID As Integer
<Column()> _
Public CustomerID As String
Private _Customer As EntityRef(Of Customer)
<Association(Storage:="Customer", ThisKey:="CustomerID")> _
Public Property Customer() As Customer
Get
Return Me._Customer.Entity
End Get
Set(ByVal value As Customer)
Me._Customer.Entity = value
End Set
End Property
End Class