Bagikan melalui


Cara: Memetakan hubungan database

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 tabel Customer dan 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-Project hubungan banyak ke banyak yang dibentuk dengan menggunakan tabel tautan EmployeeProject. LINQ to SQL mengharuskan hubungan seperti itu dimodelkan dengan menggunakan tiga kelas: Employee, Project, dan EmployeeProject. Dalam hal ini, mengubah hubungan antara Employee dan Project tampaknya memerlukan pembaruan kunci utama EmployeeProject. Namun, situasi ini paling baik dimodelkan dengan menghapus EmployeeProject yang ada dan membuat EmployeeProject baru.

    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

Lihat juga