Aracılığıyla paylaş


Veri Bağlama

LINQ to SQL, kılavuz denetimleri gibi yaygın denetimlere bağlamayı destekler. Özellikle, LINQ to SQL, hem görüntüleme hem de güncelleştirme açısından bir veri kılavuzuna bağlama ve ana ayrıntı bağlamasını işlemeye yönelik temel desenleri tanımlar.

Temel Alınan İlke

LINQ to SQL, LINQ sorgularını veritabanında yürütülmek üzere SQL'e çevirir. Sonuçlar kesin olarak yazıldı IEnumerable. Bu nesneler sıradan ortak dil çalışma zamanı (CLR) nesneleri olduğundan, sonuçları görüntülemek için sıradan nesne veri bağlaması kullanılabilir. Öte yandan, değişiklik işlemleri (eklemeler, güncelleştirmeler ve silmeler) ek adımlar gerektirir.

Operasyon

Windows Forms denetimlerine örtük olarak bağlama, IListSource uygulanarak gerçekleştirilir. Genel veri kaynakları Table<TEntity> (Table<T> C# veya Table(Of T) Visual Basic'te) ve genel DataQuery, IListSource'u uygulamak için güncelleştirildi. Kullanıcı arabirimi (UI) veri bağlama altyapıları (Windows Forms ve Windows Presentation Foundation), veri kaynaklarının IListSource'ü uygulayıp uygulamadığını test eder. Bu nedenle, denetimin veri kaynağına bir sorgunun doğrudan etkilenmesini yazmak, aşağıdaki örnekte olduğu gibi LINQ to SQL koleksiyonu oluşturmayı örtük olarak çağırır:

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

Aynı durum Windows Presentation Foundation'da da oluşur:

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

Koleksiyon nesilleri, Table<TEntity> ve DataQuery genel tipleri GetList içinde uygulanır.

IListSource Uygulaması

LINQ to SQL, IListSource iki konumda uygular:

  • Veri kaynağı bir Table<TEntity>'dir: LINQ to SQL, tabloya referans veren bir DataBindingList koleksiyonunu doldurmak üzere tabloyu gözden geçirir.

  • Veri kaynağı bir IQueryable<T>'dir. İki senaryo vardır:

    • LINQ to SQL, Table<TEntity> içinden IQueryable<T> öğesini bulursa, kaynak düzenlemeye olanak tanır ve durum, ilk madde noktasıyla aynıdır.

    • LINQ to SQL, temel alınan Table<TEntity> öğesini bulamazsa, kaynak üzerinde düzenlemeye izin vermez (örneğin, groupby). LINQ to SQL, sorguyu tarayarak belirli bir özelliğin T varlıkları için sıralama özelliğini uygulayan basit bir SortableBindingList olan genel bir BindingList<T> öğesini doldurur.

Özel Koleksiyonlar

Bu belgenin önceki bölümlerinde açıklanan birçok özellik için BindingList<T> bazı farklı sınıflar için özelleştirilmişti. Bu sınıflar genel SortableBindingList ve DataBindingList'dir. Her ikisi de iç olarak bildirilir.

Genel Amaçlı SortableBindingList

Bu sınıf öğesinden BindingList<T>devralır ve sıralanabilir bir sürümüdür BindingList<T>. Sıralama bellek içi bir çözümdür ve hiçbir zaman veritabanıyla iletişim kurar. BindingList<T> IBindingList uygular ancak varsayılan olarak sıralamayı desteklemez. Ancak, BindingList<T> sanal IBindingList yöntemleriyle uygular. Bu yöntemleri kolayca geçersiz kılabilirsiniz. Genel SortableBindingList, SupportsSortingCore, SortPropertyCore, SortDirectionCore ve ApplySortCore'ü geçersiz kılar. ApplySortCore tarafından çağrılır ApplySort ve belirli bir özelliğin T öğelerinin listesini sıralar.

Özellik T'ye ait değilse bir özel durum oluşturulur.

Sıralamayı gerçekleştirmek için LINQ to SQL, tür bağımsız SortableBindingList.PropertyComparer sınıfını, tür bağımsız IComparer.Compare sınıfından türeterek oluşturur ve belirli bir tür T, bir PropertyDescriptor ve bir yön için varsayılan bir karşılaştırıcı uygular. Bu sınıf, T'nin Comparer'sini dinamik olarak oluşturur; burada T, PropertyType öğesinin PropertyDescriptor'sidir. Ardından, varsayılan karşılaştırıcı statik genel Comparer'den alınır. Varsayılan örnek yansıma kullanılarak elde edilir.

Genel SortableBindingList ayrıca için DataBindingListtemel sınıftır. Genel SortableBindingList , öğe ekleme/kaldırma izlemesini askıya almak veya devam ettirmek için iki sanal yöntem sunar. Bu iki yöntem sıralama gibi temel özellikler için kullanılabilir, ancak gerçekten genel DataBindingListgibi üst sınıflar tarafından uygulanır.

Genel VeriBağlantıListesi

Bu sınıf, genel SortableBindingLIstöğesinden devralır. Genel DataBindingList, koleksiyonun ilk doldurulması için kullanılan genel Table'nin altındaki temel genel IQueryable üzerinde bir referans tutar. Genel DatabindingList, InsertItem() ve RemoveItem() metodlarını geçersiz kılarak koleksiyona öğe ekleme/kaldırma işlemleri için izleme ekler. Ayrıca izlemeyi koşullu hale getirmek için soyut askıya alma/sürdürme izleme özelliğini de uygular. Bu özellik, genel DataBindingList türlerin, üst sınıfların izleme özelliğinin tüm çok biçimli kullanımından faydalanmasını sağlar.

EntitySets'e Bağlama

Bağlama EntitySet özel bir durumdur çünkü EntitySet zaten IBindingList uygulayan bir koleksiyondur. LINQ to SQL, sıralama ve iptal etme (ICancelAddNew) desteği ekler. Sınıf EntitySet , varlıkları depolamak için bir iç liste kullanır. Bu liste, genel bir dizi ItemList olan genel sınıfı temel alan düşük düzeyli bir koleksiyondur.

Sıralama Özelliği Ekleme

Diziler, T türü ile kullanabileceğiniz bir sıralama yöntemi (Array.Sort()) sunar (Comparer). LINQ to SQL, bu özellik ve sıralama yönünü elde etmek için bu konuda daha önce açıklanan genel SortableBindingList.PropertyComparer sınıfını kullanır (Comparer). Bu özelliği çağırmak için genele ApplySort bir ItemList yöntem eklenir.

EntitySet tarafında, artık sıralama desteğini bildirmeniz gerekir.

System.Windows.Forms.BindingSource kullanıp bir EntitySet<TEntity'yi> System.Windows.Forms.BindingSource.DataSource'a bağladığınızda, EntitySet<TEntity'yi> çağırmanız gerekir. BindingSource.List'i güncelleştirmek için GetNewBindingList.

System.Windows.Forms.BindingSource kullanıyorsanız ve BindingSource.DataMember özelliğini ayarlayıp BindingSource.DataSource'u EntitySet TEntity'yi< kullanıma sunan BindingSource.DataMember içinde adlı özelliğe sahip bir sınıfa ayarlarsanız, EntitySet><TEntity'yi> çağırmanız gerekmez. BindingSource.List'i güncelleştirmek için GetNewBindingList, ancak Sıralama özelliğini kaybedersiniz.

Önbellekleme

LINQ to SQL sorguları uygular GetList. Windows Forms BindingSource sınıfı bu arabirimi karşıladığında, tek bir bağlantı için GetList() üç kez çağırır. Bu duruma geçici bir çözüm bulmak için LINQ to SQL, depolamak ve her zaman aynı oluşturulan koleksiyonu döndürmek için örnek başına bir önbellek uygular.

İptal

IBindingList AddNew, denetimler tarafından ilişkili bir koleksiyondan yeni bir öğe oluşturmak için kullanılan bir yöntemi tanımlar. Görünür satırın üst bilgisinde bir yıldız olduğunda DataGridView kontrolü bu özelliği çok iyi gösterir. Yıldız, yeni bir öğe ekleyebileceğinizi gösterir.

Bu özelliğe ek olarak, bir koleksiyon da uygulayabilir ICancelAddNew. Bu özellik denetimlerin yeni düzenlenen öğenin doğrulanıp doğrulanmadığını iptal etmesine veya doğrulamasına olanak tanır.

ICancelAddNew tüm LINQ to SQL veri bağlama koleksiyonlarında (genel SortableBindingList ve genel EntitySet) uygulanır. Her iki uygulamada da kod aşağıdaki gibi kullanılmaktadır:

  • Öğelerin eklenmesini ve koleksiyondan kaldırılmasını sağlar.

  • Kullanıcı arabirimi düzenlemeyi onaylamadığı sürece değişiklikleri izlemez.

  • Sürüm iptal edildikçe (CancelNew ) değişiklikleri izlemez.

  • Sürüm taahhüt edildiğinde izlemeye izin verir (EndNew).

  • Yeni öğe AddNew öğesinden gelmiyorsa, koleksiyonun normal davranmasına izin verir.

Sorun giderme

Bu bölümde LINQ to SQL veri bağlama uygulamalarınızda sorun gidermeye yardımcı olabilecek çeşitli öğeler kullanıma sunulmuştur.

  • Özellikleri kullanmanız gerekir; yalnızca alanları kullanmak yeterli değildir. Windows Forms bu kullanımı gerektirir.

  • Varsayılan olarak, image, varbinaryve timestamp veritabanı türleri bayt dizisiyle eşler. ToString() Bu senaryoda desteklenmediğinden, bu nesneler görüntülenemez.

  • Birincil anahtara eşlenen sınıf üyesinin bir ayarlayıcısı vardır, ancak LINQ to SQL nesne kimliği değişikliğini desteklemez. Bu nedenle, eşlemede kullanılan birincil/benzersiz anahtar veritabanında güncelleştirilemez. Kılavuzdaki bir değişiklik, SubmitChanges çağrısı yaptığınızda özel duruma neden olur.

  • Bir varlık iki ayrı kılavuzda (örneğin, bir ana ve başka bir ayrıntı) bağlıysa, ana kılavuzdaki bir Delete ayrıntı kılavuzuna yayılmaz.

Ayrıca bakınız