Nasıl yapılır: Veritabanı ilişkilerini eşleme
Varlık sınıfınızda her zaman aynı olacak tüm veri ilişkilerini özellik başvuruları olarak kodlayabilirsiniz. Örneğin Northwind örnek veritabanında müşteriler genellikle sipariş verdikleri için modelde müşterilerle siparişleri arasında her zaman bir ilişki vardır.
LINQ to SQL, bu tür ilişkileri temsil etmeye yardımcı olacak bir AssociationAttribute öznitelik tanımlar. Bu öznitelik, veritabanındaki yabancı anahtar ilişkisini temsil etmek için ve EntityRef<TEntity> türleriyle EntitySet<TEntity> birlikte kullanılır. Daha fazla bilgi için Öznitelik Tabanlı Eşleme'nin İlişkilendirme Özniteliği bölümüne bakın.
Not
AssociationAttribute ve ColumnAttribute Storage özellik değerleri büyük/küçük harfe duyarlıdır. Örneğin, AssociationAttribute.Storage özelliğinin özniteliğinde kullanılan değerlerin kodun başka bir yerinde kullanılan ilgili özellik adları için büyük/küçük harfle eşleştiğinden emin olun. Bu, Visual Basic de dahil olmak üzere genellikle büyük/küçük harfe duyarlı olmayan tüm .NET programlama dilleri için geçerlidir. Depolama özelliği hakkında daha fazla bilgi için bkz DataAttribute.Storage. .
Çoğu ilişki, bu konunun ilerleyen bölümlerindeki örnekte olduğu gibi bire çok şeklindedir. Ayrıca, bire bir ve çoka çok ilişkilerini aşağıdaki gibi temsil edebilirsiniz:
Bire bir: Her iki tarafa da ekleyerek EntitySet<TEntity> bu tür bir ilişkiyi temsil eder.
Örneğin, müşterinin güvenlik kodunun tabloda bulunmayacak
Customer
ve yalnızca yetkili kişiler tarafından erişilebileceği şekilde oluşturulmuş birSecurityCode
Customer
-ilişki düşünün.Çoka çok: Çoka çok ilişkilerinde, bağlantı tablosunun birincil anahtarı (birleşim tablosu olarak da adlandırılır) genellikle diğer iki tablodan yabancı anahtarların bileşimiyle oluşturulur.
Örneğin, bağlantı tablosu
EmployeeProject
kullanılarak oluşturulan çokaProject
Employee
-çok ilişkisini göz önünde bulundurun. LINQ to SQL, böyle bir ilişkinin üç sınıf kullanılarak modellenmesini gerektirir:Employee
,Project
veEmployeeProject
. Bu durumda, ileProject
arasındakiEmployee
ilişkiyi değiştirmek, birincil anahtarınEmployeeProject
güncelleştirilip güncelleştirilmeye gerek duymayabileceği görünebilir. Ancak, bu durum mevcut bir silme ve yeniEmployeeProject
birEmployeeProject
oluşturma olarak modellenmiştir.Not
İlişkisel veritabanlarındaki ilişkiler genellikle diğer tablolardaki birincil anahtarlara başvuran yabancı anahtar değerleri olarak modellenir. Bunlar arasında gezinmek için ilişkisel birleştirme işlemi kullanarak iki tabloyu açıkça ilişkilendirirsiniz.
LINQ to SQL'deki nesneler ise noktalı gösterimi kullanarak gezindiğiniz özellik başvurularını veya başvuru koleksiyonlarını kullanarak birbirine başvurur.
Örnek 1
Aşağıdaki bire çok örneğinde, sınıfın Customer
müşterilerle siparişleri arasındaki ilişkiyi bildiren bir özelliği vardır. Orders
özelliği türündedirEntitySet<TEntity>. Bu tür, bu ilişkinin bire çok (bir müşteriden çok siparişe) olduğunu gösterir. OtherKey özelliği, bu ilişkilendirmenin nasıl gerçekleştirileceğini açıklamak için, yani bu ilişkiyle karşılaştırılacak ilgili sınıftaki özelliğin adını belirterek kullanılır. Bu örnekte, bir veritabanı birleştirmesinin CustomerID
bu sütun değerini karşılaştırması gibi özellik karşılaştırılır.
Not
Visual Studio kullanıyorsanız, sınıflar arasında bir ilişkilendirme oluşturmak için Nesne İlişkisel Tasarımcısı kullanabilirsiniz.
[Table(Name = "Customers")]
public partial class Customer
{
[Column(IsPrimaryKey = true)]
public string CustomerID;
// ...
private EntitySet<Order> _Orders;
[Association(Storage = "_Orders", OtherKey = "CustomerID")]
public EntitySet<Order> Orders
{
get { return this._Orders; }
set { this._Orders.Assign(value); }
}
}
<Table(Name:="Customers")> _
Public Class Customer
<Column(IsPrimaryKey:=True)> _
Public CustomerID As String
' ...
Private _Orders As EntitySet(Of Order)
<Association(Storage:="_Orders", OtherKey:="CustomerID")> _
Public Property Orders() As EntitySet(Of Order)
Get
Return Me._Orders
End Get
Set(ByVal value As EntitySet(Of Order))
Me._Orders.Assign(value)
End Set
End Property
End Class
Örnek 2
Ayrıca durumu tersine çevirebilirsiniz. Müşteriler ve siparişler arasındaki ilişkiyi açıklamak için sınıfını kullanmak Customer
yerine sınıfını Order
kullanabilirsiniz. sınıfı, Order
aşağıdaki kod örneğinde EntityRef<TEntity> olduğu gibi müşteriyle olan ilişkiyi açıklamak için türünü kullanır.
Not
EntityRef<TEntity> sınıfı ertelenmiş yüklemeyi destekler. Daha fazla bilgi için bkz. Ertelenmiş ve Anında Yükleme.
[Table(Name = "Orders")]
public class Order
{
[Column(IsPrimaryKey = true)]
public int OrderID;
[Column]
public string CustomerID;
private EntityRef<Customer> _Customer;
[Association(Storage = "_Customer", ThisKey = "CustomerID")]
public Customer Customer
{
get { return this._Customer.Entity; }
set { this._Customer.Entity = value; }
}
}
<Table(Name:="Orders")> _
Public Class Order
<Column(IsPrimaryKey:=True)> _
Public OrderID As Integer
<Column()> _
Public CustomerID As String
Private _Customer As EntityRef(Of Customer)
<Association(Storage:="Customer", ThisKey:="CustomerID")> _
Public Property Customer() As Customer
Get
Return Me._Customer.Entity
End Get
Set(ByVal value As Customer)
Me._Customer.Entity = value
End Set
End Property
End Class