Aracılığıyla paylaş


Nesne Kimliği

Çalışma zamanındaki nesnelerin benzersiz kimlikleri vardır. Aynı nesneye başvuran iki değişken aslında nesnenin aynı örneğine başvurur. Bu nedenle, bir değişken aracılığıyla bir yol yoluyla yaptığınız değişiklikler hemen diğer değişkenden görülebilir.

İlişkisel veritabanı tablosundaki satırların benzersiz kimlikleri yoktur. Her satırın benzersiz bir birincil anahtarı olduğundan, iki satır aynı anahtar değerini paylaşmaz. Ancak bu olgu yalnızca veritabanı tablosunun içeriğini kısıtlar.

Gerçekte, veriler çoğunlukla veritabanından çıkarılır ve bir uygulamanın onunla çalıştığı farklı bir katmana getirilir. Bu, LINQ to SQL'in desteklediği modeldir. Veriler veritabanından satır olarak getirildiğinde, aynı verileri temsil eden iki satırın aslında aynı satır örneklerine karşılık geldiğini hiç beklemiş olmazsınız. Belirli bir müşteriyi iki kez sorgularsanız, iki veri satırı alırsınız. Her satır aynı bilgileri içerir.

Nesnelerle çok farklı bir şey beklersiniz. Aynı bilgileri tekrar tekrar sorarsanız DataContext , aslında size aynı nesne örneğini vereceğini bekliyorsunuz. Nesneler uygulamanız için özel bir anlama sahip olduğundan ve nesneler gibi davranmalarını beklediğiniz için bu davranışı beklersiniz. Bunları hiyerarşi veya grafik olarak tasarladınız. Aynı şeyi birden çok kez istediniz diye bunları bu şekilde almayı ve çok sayıda çoğaltılmış örneği almamanızı beklersiniz.

LINQ to SQL'de DataContext nesne kimliğini yönetir. Veritabanından yeni bir satır aldığınız her durumda, satır birincil anahtarı tarafından bir kimlik tablosunda günlüğe kaydedilir ve yeni bir nesne oluşturulur. Aynı satırı her aldığınız zaman, özgün nesne örneği uygulamaya geri teslim edilir. Bu şekilde, DataContext veritabanı tarafından görülen kimlik kavramını (birincil anahtarlar) dilin (örneğin örnekler) gördüğü kimlik kavramına çevirir. Uygulama nesneyi yalnızca ilk alındığı durumda görür. Farklıysa yeni veriler atılır. Daha fazla bilgi için bkz . Kimlik Önbelleğinden Nesne Alma.

LINQ to SQL, iyimser güncelleştirmeleri desteklemek amacıyla yerel nesnelerin bütünlüğünü yönetmek için bu yaklaşımı kullanır. Nesne ilk kez oluşturulduktan sonra gerçekleşen değişiklikler uygulama tarafından yapılan değişiklikler olduğundan, uygulamanın amacı açıktır. Ara dönemde bir dış tarafın yaptığı değişiklikler meydana gelirse, o sırada SubmitChanges() bunlar tanımlanır.

Not

Sorgu tarafından istenen nesne, zaten alınan bir nesne olarak kolayca tanımlanabilirse, hiçbir sorgu yürütülür. Kimlik tablosu, daha önce alınan tüm nesnelerin önbelleği olarak görev yapar.

Örnekler

Nesne Önbelleğe Alma Örnek 1

Bu örnekte, aynı sorguyu iki kez yürütürseniz, her seferinde bellekte aynı nesneye başvuru alırsınız.

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Nesne Önbelleğe Alma Örnek 2

Bu örnekte, veritabanından aynı satırı döndüren farklı sorgular yürütürseniz, her seferinde bellekte aynı nesneye başvuru alırsınız.

Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from ord in db.Orders
     where ord.Customer.CustomerID == "BONAP"
     select ord).First().Customer;
Dim cust1 As Customer = _
    (From cust In db.Customers _
     Where cust.CustomerID = "BONAP" _
     Select cust).First()

Dim cust2 As Customer = _
    (From ord In db.Orders _
     Where ord.Customer.CustomerID = "BONAP" _
     Select ord).First().Customer

Ayrıca bkz.