Bagikan melalui


Pengikatan Data

LINQ to SQL mendukung pengikatan ke kontrol umum, seperti kontrol kisi. Secara khusus, LINQ to SQL mendefinisikan pola dasar untuk mengikat ke kisi data dan menangani pengikatan detail master, baik yang berkaitan dengan tampilan dan pembaruan.

Prinsip yang Mendasari

LINQ to SQL menerjemahkan kueri LINQ to SQL untuk dieksekusi pada database. Hasilnya diketik dengan kuat IEnumerable. Karena objek ini adalah objek runtime bahasa umum (CLR), pengikatan data objek biasa dapat digunakan untuk menampilkan hasilnya. Di sisi lain, operasi perubahan (menyisipkan, memperbarui, dan menghapus) memerlukan langkah tambahan.

Operasi

Mengikat secara implisit ke kontrol Formulir Windows dilakukan dengan menerapkan IListSource. Sumber data umum Table<TEntity> (Table<T> dalam C# atau Table(Of T) dalam Visual Basic) dan umum DataQuery telah diperbarui untuk menerapkan IListSource. Mesin pengikatan data antarmuka pengguna (UI) (Formulir Windows dan Windows Presentation Foundation) keduanya menguji apakah sumber data mereka menerapkan IListSource. Oleh karena itu, menulis pengaruh langsung kueri ke sumber data kontrol secara implisit memanggil pembuatan kumpulan LINQ to 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

Pembuatan kumpulan diterapkan oleh Table<TEntity> umum dan DataQuery umum di GetList.

Penerapan IListSource

LINQ to SQL menerapkan IListSource di dua lokasi:

  • Sumber datanya adalah Table<TEntity>: LINQ to SQL menelusuri tabel untuk mengisi kumpulan DataBindingList yang menyimpan referensi di tabel.

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

    • Jika LINQ to SQL menemukan Table<TEntity> yang mendasarinya dari IQueryable<T>, sumber mengizinkan edisi dan situasinya sama seperti pada poin pertama.

    • Jika LINQ to SQL tidak dapat menemukan Table<TEntity> yang mendasarinya, sumber tidak mengizinkan edisi (misalnya, groupby). LINQ to SQL menelusuri kueri untuk mengisi SortableBindingList umum, yang merupakan BindingList<T> sederhana yang menerapkan fitur pengurutan untuk entitas T untuk properti tertentu.

Kumpulan Khusus

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

SortableBindingList Umum

Kelas ini mewarisi dari BindingList<T>, dan merupakan versi BindingList<T> yang dapat diurutkan. Pengurutan adalah solusi dalam memori dan tidak pernah menghubungi database itu sendiri. BindingList<T> menerapkan IBindingList tetapi tidak mendukung pengurutan secara default. Namun, BindingList<T> menerapkan IBindingList dengan metode inti virtual. Anda dapat dengan mudah mengganti metode ini. SortableBindingList umum 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 to SQL membuat kelas SortableBindingList.PropertyComparer umum yang mewarisi dari IComparer.Compare umum dan menerapkan pembanding default untuk jenis T, PropertyDescriptor, dan arah tertentu. Kelas ini secara dinamis membuat Comparer dari T di mana T adalah PropertyType dari PropertyDescriptor. Kemudian, pembanding default diambil dari Comparer umum statis. Instans default diperoleh dengan menggunakan refleksi.

SortableBindingList umum juga merupakan kelas dasar untuk DataBindingList. SortableBindingList umum menawarkan dua metode virtual untuk menangguhkan atau melanjutkan item tambah/hapus pelacakan. Kedua metode tersebut dapat digunakan untuk fitur dasar seperti pengurutan, tetapi akan benar-benar diterapkan oleh kelas atas seperti DataBindingList umum.

DataBindingList Umum

Kelas ini mewarisi dari SortableBindingLIst umum. DataBindingList umum menyimpan referensi pada Table umum yang mendasari dari IQueryable umum yang digunakan untuk pengisian awal kumpulan. DatabindingList umum menambahkan pelacakan untuk item tambah/hapus ke kumpulan dengan menimpa InsertItem() dan RemoveItem(). Ini juga menerapkan fitur pelacakan penangguhan/lanjutan abstrak untuk membuat pelacakan bersyarat. Fitur ini membuat DataBindingList umum memanfaatkan semua penggunaan polimorfik dari fitur pelacakan kelas induk.

Pengikatan ke EntitySets

Pengikatan ke EntitySet adalah kasus khusus karena EntitySet sudah merupakan kumpulan yang menerapkan IBindingList. LINQ to SQL menambahkan dukungan pengurutan dan pembatalan (ICancelAddNew). Kelas EntitySet menggunakan daftar internal untuk menyimpan entitas. Daftar ini adalah kumpulan tingkat rendah berdasarkan array umum, kelas ItemList umum.

Menambahkan Fitur Pengurutan

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

Di sisi EntitySet, Anda sekarang harus mendeklarasikan 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 serta mengatur BindingSource.DataSource ke kelas yang memiliki properti bernama di BindingSource.DataMember yang mengekspos EntitySet<TEntity>, Anda tidak perlu memanggil EntitySet<TEntity>.GetNewBindingList untuk memperbarui BindingSource.List, tetapi Anda akan kehilangan kemampuan Pengurutan.

penembolokan

Kueri LINQ to SQL menerapkan GetList. Ketika kelas Formulir Windows BindingSource memenuhi antarmuka ini, kelas ini akan memanggil GetList() tiga kali untuk satu koneksi. Untuk mengatasi situasi ini, LINQ to SQL menerapkan cache per instans untuk menyimpan dan selalu mengembalikan kumpulan yang dihasilkan yang sama.

Pembatalan

IBindingList mendefinisikan metode AddNew yang digunakan oleh kontrol untuk membuat item baru dari kumpulan terikat. Kontrol DataGridView menunjukkan fitur ini dengan sangat baik saat baris terakhir yang terlihat berisi bintang di headernya. Bintang menunjukkan bahwa Anda dapat menambahkan item baru.

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

ICancelAddNew diterapkan di semua kumpulan databound LINQ to SQL (SortableBindingList umum dan EntitySet umum). Di kedua penerapan, kode melakukan hal berikut:

  • Memungkinkan item dimasukkan dan kemudian dihapus dari kumpulan.

  • Tidak melacak perubahan selama UI tidak menerapkan edisi.

  • Tidak melacak perubahan selama edisi dibatalkan (CancelNew).

  • Memungkinkan pelacakan saat edisi diterapkan (EndNew).

  • Mengizinkan kumpulan berperilaku normal jika item baru tidak berasal dari AddNew.

Pemecahan Masalah

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

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

  • Secara default, 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 pengatur, tetapi LINQ to SQL tidak mendukung perubahan identitas objek. Oleh karena itu, kunci utama/unik yang digunakan dalam pemetaan tidak dapat diperbarui dalam database. Perubahan pada kisi menyebabkan pengecualian saat Anda memanggil SubmitChanges.

  • Jika entitas terikat dalam dua kisi terpisah (misalnya, satu master dan detail lainnya), Delete di kisi master tidak disebarkan ke kisi detail.

Lihat juga