Bagikan melalui


Pengikatan Data

LINQ ke SQL mendukung pengikatan ke kontrol-kontrol umum, seperti kontrol grid. Secara khusus, LINQ ke SQL mendefinisikan pola dasar untuk menghubungkan ke grid data dan menangani pengikatan master-detail, baik sehubungan dengan tampilan dan pembaruan.

Prinsip Yang Mendasari

LINQ ke SQL menerjemahkan kueri LINQ ke SQL untuk dieksekusi pada database. Hasilnya sangat ditik IEnumerable. Karena objek ini adalah objek runtime bahasa umum biasa (CLR), pengikatan data objek biasa dapat digunakan untuk menampilkan hasilnya. Di sisi lain, operasi perubahan (penyisipan, pembaruan, dan penghapusan) memerlukan langkah tambahan.

Operasi

Pengikatan implisit ke kontrol Windows Forms dicapai dengan menerapkan IListSource. Sumber data generik Table<TEntity> (Table<T> dalam C# atau Table(Of T) di Visual Basic) dan generik DataQuery telah diperbarui untuk mengimplementasikan IListSource. Mesin pengikatan data antarmuka pengguna (UI) (Windows Forms dan Windows Presentation Foundation) keduanya menguji apakah sumber data mereka mengimplementasikan IListSource. Oleh karena itu, menulis pengaruh langsung kueri ke sumber data kontrol secara implisit memanggil LINQ ke pembuatan koleksi SQL, seperti dalam contoh berikut:

DataGrid dataGrid1 = new DataGrid();
DataGrid dataGrid2 = new DataGrid();
DataGrid dataGrid3 = new DataGrid();

var custQuery =
    from cust in db.Customers
    select cust;
dataGrid1.DataSource = custQuery;
dataGrid2.DataSource = custQuery;
dataGrid2.DataMember = "Orders";

BindingSource bs = new BindingSource();
bs.DataSource = custQuery;
dataGrid3.DataSource = bs;
Dim dataGrid1 As New DataGrid()
Dim dataGrid2 As New DataGrid()
Dim dataGrid3 As New DataGrid()

Dim custQuery = _
    From cust In db.Customers _
    Select cust

dataGrid1.DataSource = custQuery
dataGrid2.DataSource = custQuery
dataGrid2.DataMember = "Orders"

Dim bs = _
    New BindingSource()
bs.DataSource = custQuery
dataGrid3.DataSource = bs

Hal yang sama terjadi dengan Windows Presentation Foundation:

ListView listView1 = new ListView();
var custQuery2 =
    from cust in db.Customers
    select cust;

ListViewItem ItemsSource = new ListViewItem();
ItemsSource = (ListViewItem)custQuery2;
Dim listView1 As New ListView()
Dim custQuery2 = _
From cust In db.Customers _
Select cust

Dim ItemsSource As New ListViewItem
ItemsSource = custQuery2

Generasi koleksi dilakukan oleh generik Table<TEntity> dan generik DataQuery dalam GetList.

Implementasi IListSource

LINQ ke SQL menerapkan IListSource di dua lokasi:

  • Sumber data adalah Table<TEntity>: LINQ ke SQL menelusuri tabel untuk mengisi DataBindingList koleksi yang menyimpan referensi pada tabel.

  • Sumber data adalah IQueryable<T>. Ada dua skenario:

    • Jika LINQ ke SQL menemukan basis Table<TEntity> dari IQueryable<T>, sumber memungkinkan pengeditan dan situasinya sama seperti di poin pertama.

    • Jika LINQ ke SQL tidak dapat menemukan elemen dasar Table<TEntity>, sumber tidak memungkinkan pengeditan (misalnya, groupby). LINQ ke SQL menelusuri kueri untuk mengisi SortableBindingList generik, yang merupakan objek sederhana BindingList<T> yang mengimplementasikan fitur pengurutan untuk entitas T untuk properti tertentu yang diberikan.

Koleksi Khusus

Untuk banyak fitur yang dijelaskan sebelumnya dalam dokumen ini, BindingList<T> telah dikhususkan untuk beberapa kelas yang berbeda. Kelas-kelas ini generik SortableBindingList dan generik DataBindingList. Keduanya dinyatakan statusnya sebagai internal.

DaftarSortableBinding Generik

Kelas ini mewarisi dari BindingList<T>, dan merupakan versi yang dapat diurutkan dari BindingList<T>. Pengurutan adalah solusi di dalam memori dan tidak pernah berhubungan dengan database itu sendiri. BindingList<T> IBindingList mengimplementasikan tetapi tidak mendukung pengurutan secara default. Namun, BindingList<T> menerapkan IBindingList dengan metode inti virtual. Anda dapat dengan mudah mengambil alih metode ini. Penggantian umum SortableBindingList menggantikan SupportsSortingCore, SortPropertyCore, SortDirectionCore, dan ApplySortCore. ApplySortCore dipanggil oleh ApplySort dan mengurutkan daftar item T untuk properti tertentu.

Pengecualian dimunculkan jika properti bukan milik T.

Untuk mencapai pengurutan, LINQ ke SQL membuat kelas generik SortableBindingList.PropertyComparer yang mewarisi dari generik IComparer.Compare dan mengimplementasikan perbandingan default untuk jenis T tertentu, sebuah PropertyDescriptor, dan arah. Kelas ini secara dinamis menciptakan Comparer T di mana T adalah PropertyType dari PropertyDescriptor. Kemudian, pembanding default diambil dari Comparer generik statis. Instans default diperoleh dengan menggunakan pantulan.

Generik SortableBindingList juga merupakan kelas dasar untuk DataBindingList. Generik SortableBindingList menawarkan dua metode virtual untuk menangguhkan atau melanjutkan pelacakan penambahan/penghapusan item. Kedua metode tersebut dapat digunakan untuk fitur dasar seperti pengurutan, tetapi benar-benar akan diimplementasikan oleh kelas atas seperti generik DataBindingList.

Daftar Pengikatan Data Generik

Kelas ini mewarisi dari generik SortableBindingLIst. Generik DataBindingList menyimpan referensi pada generik Table yang mendasar dari generik IQueryable yang digunakan untuk pengisian awal koleksi. Generik DatabindingList mengaktifkan pelacakan untuk penambahan/penghapusan item dalam koleksi dengan meng-overriding InsertItem() dan RemoveItem(). Ini juga mengimplementasikan fitur abstrak menangguhkan/melanjutkan pelacakan untuk membuat pelacakan kondisional. Fitur ini membuat generik DataBindingList memanfaatkan semua penggunaan polimorfik dari fitur pelacakan kelas induk.

Pengikatan ke Set Entitas

Mengikat ke EntitySet adalah kasus khusus karena EntitySet sudah merupakan koleksi yang mengimplementasikan IBindingList. LINQ ke SQL menambahkan dukungan pengurutan dan pembatalan (ICancelAddNew). Kelas EntitySet menggunakan daftar internal untuk menyimpan entitas. Daftar ini adalah kumpulan tingkat rendah yang didasarkan pada array generik, kelas ItemList generik.

Menambahkan Fitur Pengurutan

Array menawarkan metode pengurutan (Array.Sort()) yang dapat Anda gunakan dengan Comparer T. LINQ ke SQL menggunakan kelas generik SortableBindingList.PropertyComparer yang dijelaskan sebelumnya dalam topik ini untuk mendapatkan ini Comparer untuk properti dan arah yang akan diurutkan. Metode ApplySort ditambahkan ke generik ItemList untuk memanggil fitur ini.

Di sisi EntitySet, Anda sekarang harus menyatakan dukungan pengurutan.

Saat Anda menggunakan System.Windows.Forms.BindingSource dan mengikat EntitySet<TEntity> ke System.Windows.Forms.BindingSource.DataSource, Anda harus memanggil EntitySet<TEntity>. GetNewBindingList untuk memperbarui BindingSource.List.

Jika Anda menggunakan System.Windows.Forms.BindingSource dan mengatur properti BindingSource.DataMember dan mengatur BindingSource.DataSource ke kelas yang memiliki properti bernama di BindingSource.DataMember yang mengekspos EntitasSet<TEntity>, Anda tidak perlu memanggil EntitasSet<TEntity>. GetNewBindingList untuk memperbarui BindingSource.List tetapi Anda kehilangan kemampuan Pengurutan.

Penggunaan Cache

Kueri LINQ ke SQL menerapkan GetList. Ketika kelas Windows Forms BindingSource memenuhi antarmuka ini, kelas ini memanggil GetList() tiga kali untuk satu koneksi. Untuk mengatasi situasi ini, LINQ ke SQL mengimplementasikan cache per instans untuk disimpan dan selalu mengembalikan koleksi yang dihasilkan yang sama.

Pembatalan

IBindingList AddNew menentukan metode yang digunakan oleh kontrol untuk membuat item baru dari koleksi terikat. DataGridView Kontrol ini menampilkan fitur tersebut dengan jelas ketika baris terakhir yang terlihat berisi bintang di bagian header. Bintang menunjukkan kepada Anda bahwa Anda dapat menambahkan item baru.

Selain fitur ini, koleksi juga dapat menerapkan ICancelAddNew. Fitur ini memungkinkan kontrol untuk membatalkan atau memvalidasi bahwa item baru yang diedit telah divalidasi atau tidak.

ICancelAddNew diterapkan di semua koleksi terikat data LINQ ke SQL (generik SortableBindingList dan generik EntitySet). Dalam kedua implementasi kode dilakukan sebagai berikut:

  • Memungkinkan item-item untuk dimasukkan dan kemudian dihapus dari koleksi.

  • Tidak melacak perubahan selama UI tidak mengkonfirmasi pengeditan.

  • Tidak melacak perubahan selama edisi dibatalkan (CancelNew).

  • Memungkinkan pelacakan ketika versi disimpan (EndNew).

  • Biarkan koleksi berulah secara normal jika item baru tidak berasal dari AddNew.

Penyelesaian Masalah

Bagian ini memanggil beberapa item yang mungkin membantu memecahkan masalah LINQ Anda ke aplikasi pengikatan data SQL.

  • Anda harus menggunakan properti; hanya menggunakan bidang tidak cukup. Formulir Windows memerlukan penggunaan ini.

  • Secara bawaan, jenis database image, varbinary, dan timestamp dipetakan ke array byte. Karena ToString() tidak didukung dalam skenario ini, objek ini tidak dapat ditampilkan.

  • Anggota kelas yang dipetakan ke kunci utama memiliki setter, tetapi LINQ ke SQL tidak mendukung perubahan identitas objek. Oleh karena itu, kunci primer/unik yang digunakan dalam pemetaan tidak dapat diperbarui dalam database. Perubahan dalam jaringan menyebabkan pengecualian saat Anda memanggil SubmitChanges.

  • Jika sebuah entitas terikat dalam dua grid yang terpisah (misalnya, satu master dan satu detail), Delete pada grid master tidak disebarkan ke grid detail.

Lihat juga