Model Objek LINQ untuk SQL
Dalam LINQ untuk SQL, model objek yang dinyatakan dalam bahasa pemrograman pengembang dipetakan ke model data database relasional. Operasi pada data kemudian dilakukan sesuai dengan model objek.
Dalam skenario ini, Anda tidak mengeluarkan perintah database (misalnya, INSERT
) ke database. Sebagai gantinya, Anda mengubah nilai dan menjalankan metode dalam model objek Anda. Saat Anda ingin mengkueri database atau mengirimkannya perubahan, LINQ untuk SQL menerjemahkan permintaan Anda ke dalam perintah SQL yang benar dan mengirim perintah tersebut ke database.
Elemen paling mendasar dalam LINQ untuk SQL model objek dan hubungannya dengan elemen dalam model data relasional diringkas dalam tabel berikut:
LINQ untuk Model Objek SQL | Model Data Relasional |
---|---|
Kelas entitas | Tabel |
Anggota kelas | Kolom |
Asosiasi | Hubungan kunci asing |
Metode | Prosedur atau Fungsi Tersimpan |
Catatan
Deskripsi berikut mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang model dan aturan data relasional.
Kelas LINQ untuk Entity SQL dan Tabel Database
Dalam LINQ untuk SQL, tabel database diwakili oleh kelas entitas. Kelas entitas seperti kelas lain yang mungkin Anda buat kecuali Anda membuat anotasi kelas dengan menggunakan informasi khusus yang mengaitkan kelas dengan tabel database. Anda membuat anotasi ini dengan menambahkan atribut kustom (TableAttribute) ke deklarasi kelas Anda, seperti dalam contoh berikut:
Contoh
[Table(Name = "Customers")]
public class Customerzz
{
public string CustomerID;
// ...
public string City;
}
<Table(Name:="Customers")> _
Public Class Customer
Public CustomerID As String
' ...
Public City As String
End Class
Hanya instans kelas yang dinyatakan sebagai tabel (yaitu, kelas entitas) yang dapat disimpan ke database.
Untuk informasi selengkapnya, lihat bagian Atribut Tabel dari Pemetaan Berbasis Atribut.
Anggota Kelas LINQ untuk SQL dan Kolom Database
Selain mengaitkan kelas dengan tabel, Anda menunjuk bidang atau properti untuk mewakili kolom database. Untuk tujuan ini, LINQ untuk SQL mendefinisikan atribut ColumnAttribute, seperti dalam contoh berikut:
Contoh
[Table(Name = "Customers")]
public class Customer
{
[Column(IsPrimaryKey = true)]
public string CustomerID;
[Column]
public string City;
}
<Table(Name:="Customers")> _
Public Class Customer
<Column(IsPrimaryKey:=True)> _
Public CustomerID As String
<Column()> _
Public City As String
End Class
Hanya bidang dan properti yang dipetakan ke kolom yang dipertahankan atau diambil dari database. Kolom yang tidak dinyatakan sebagai kolom dianggap sebagai bagian sementara dari logika aplikasi Anda.
Atribut ColumnAttribute ini memiliki berbagai properti yang dapat Anda gunakan untuk menyesuaikan anggota ini yang mewakili kolom (misalnya, menunjuk anggota sebagai mewakili kolom kunci primer). Untuk informasi selengkapnya, lihat bagian Atribut Kolom dari Pemetaan Berbasis Atribut.
Asosiasi LINQ ke SQL dan Hubungan Kunci Asing Database
Dalam LINQ untuk SQL, Anda mewakili asosiasi database (seperti kunci asing ke hubungan kunci primer) dengan menerapkan atribut AssociationAttribute. Di segmen kode berikut, kelas Order
berisi properti Customer
yang memiliki atribut AssociationAttribute. Properti ini dan atributnya menyediakan kelas Order
dengan hubungan ke kelas Customer
.
Contoh kode berikut menunjukkan properti Customer
dari kelas Order
.
Contoh
[Association(Name="FK_Orders_Customers", Storage="_Customer", ThisKey="CustomerID", IsForeignKey=true)]
public Customer Customer
{
get
{
return this._Customer.Entity;
}
set
{
Customer previousValue = this._Customer.Entity;
if (((previousValue != value)
|| (this._Customer.HasLoadedOrAssignedValue == false)))
{
this.SendPropertyChanging();
if ((previousValue != null))
{
this._Customer.Entity = null;
previousValue.Orders.Remove(this);
}
this._Customer.Entity = value;
if ((value != null))
{
value.Orders.Add(this);
this._CustomerID = value.CustomerID;
}
else
{
this._CustomerID = default(string);
}
this.SendPropertyChanged("Customer");
}
}
}
<Association(Name:="FK_Orders_Customers", Storage:="_Customer", ThisKey:="CustomerID", IsForeignKey:=true)> _
Public Property Customer() As Customer
Get
Return Me._Customer.Entity
End Get
Set
Dim previousValue As Customer = Me._Customer.Entity
If (((previousValue Is value) _
= false) _
OrElse (Me._Customer.HasLoadedOrAssignedValue = false)) Then
Me.SendPropertyChanging
If ((previousValue Is Nothing) _
= false) Then
Me._Customer.Entity = Nothing
previousValue.Orders.Remove(Me)
End If
Me._Customer.Entity = value
If ((value Is Nothing) _
= false) Then
value.Orders.Add(Me)
Me._CustomerID = value.CustomerID
Else
Me._CustomerID = CType(Nothing, String)
End If
Me.SendPropertyChanged("Customer")
End If
End Set
End Property
Untuk informasi selengkapnya, lihat bagian Atribut Asosiasi dari Pemetaan Berbasis Atribut.
Metode LINQ ke SQL dan Prosedur Tersimpan Database
LINQ ke SQL mendukung prosedur tersimpan dan fungsi yang ditentukan pengguna. Di LINQ ke SQL, Anda memetakan abstraksi yang ditentukan basis data ini ke objek klien sehingga Anda dapat mengaksesnya dengan cara yang diketik dengan kuat dari kode klien. Tanda tangan metode menyerupai sedekat mungkin tanda tangan prosedur dan fungsi yang ditentukan dalam database. Anda dapat menggunakan IntelliSense untuk menemukan metode ini.
Set hasil yang dikembalikan oleh panggilan ke prosedur yang dipetakan adalah koleksi yang diketik dengan kuat.
LINQ untuk SQL memetakan prosedur dan fungsi tersimpan ke metode dengan menggunakan atribut FunctionAttribute dan ParameterAttribute. Metode yang mewakili prosedur tersimpan dibedakan dari metode yang mewakili fungsi yang ditentukan pengguna oleh properti IsComposable. Jika properti ini diatur ke false
(default), metode mewakili prosedur tersimpan. Jika diatur ke true
, metode mewakili fungsi database.
Catatan
Jika Anda menggunakan Visual Studio, Anda dapat menggunakan Perancang Relational Objek untuk membuat metode yang dipetakan ke prosedur tersimpan dan fungsi yang ditentukan pengguna.
Contoh
// This is an example of a stored procedure in the Northwind
// sample database. The IsComposable property defaults to false.
[Function(Name="dbo.CustOrderHist")]
public ISingleResult<CustOrderHistResult> CustOrderHist([Parameter(Name="CustomerID", DbType="NChar(5)")] string customerID)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID);
return ((ISingleResult<CustOrderHistResult>)(result.ReturnValue));
}
' This is an example of a stored procedure in the Northwind
' sample database. The IsComposable property defaults to false.
<FunctionAttribute(Name:="dbo.CustOrderHist")> _
Public Function CustOrderHist(<Parameter(Name:="CustomerID", DbType:="NChar(5)")> ByVal customerID As String) As ISingleResult(Of CustOrderHistResult)
Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod, MethodInfo), customerID)
Return CType(result.ReturnValue, ISingleResult(Of CustOrderHistResult))
End Function
Untuk informasi selengkapnya, lihat bagian Atribut Fungsi, Atribut Prosedur Tersimpan, dan Atribut Parameter dari Pemetaan Berbasis Atribut dan Prosedur Tersimpan.