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ında yabancı anahtar ilişkisi olacak şeyi temsil etmek için EntitySet<TEntity> ve EntityRef<TEntity> türleriyle 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 ilişki: Bu tür bir ilişkiyi her iki tarafa da EntitySet<TEntity> ekleyerek temsil edin.

    Örneğin, müşterinin güvenlik kodunun tabloda bulunmayacak Customer ve yalnızca yetkili kişiler tarafından erişilebileceği şekilde oluşturulmuş bir-SecurityCodeCustomerilişki düşünün.

  • Çoka çok: Çoka çok ilişkilerinde, bağlantı tablosunun birincil anahtarı (ki bu tabloya birleşim tablosu da denir) genellikle diğer iki tablodan gelen yabancı anahtarların bileşimiyle oluşturulur.

    Örneğin, Employee-Project çoka çok ilişkisi oluşturmak için bağlantı tablosu EmployeeProject kullanılarak oluşturulan durumu göz önünde bulundurun. LINQ to SQL, böyle bir ilişkinin üç sınıf kullanılarak modellenmesini gerektirir: Employee, Projectve EmployeeProject. Bu durumda, Employee ile Project arasındaki ilişkiyi değiştirmek, birincil anahtar EmployeeProject'nin güncelleştirilmesi gerektiğini gösterebilir. Ancak, bu durum en iyi şekilde mevcut bir EmployeeProject silme ve yeni bir EmployeeProject oluşturma olarak modellenir.

    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, Customer sınıfı müşterilerle siparişleri arasındaki ilişkiyi bildiren bir özelliğe sahiptir. Orders özelliği türündedirEntitySet<TEntity>. Bu tür ilişki, bu ilişkinin bire çok (bir müşteriden çok sayıda 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, CustomerID özelliği, bir veritabanı join'u bu sütun değerini nasıl karşılaştırırsa öyle 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 tanımlamak için Customer sınıfı yerine Order sınıfını kullanabilirsiniz. Order sınıfı, aşağıdaki kod örneğinde olduğu gibi müşteriyle olan ilişkiyi açıklamak için EntityRef<TEntity> 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

Ayrıca bkz.