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 EmployeeProjectkullanı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, Projectve EmployeeProject. Bu durumda, ile Project arasındaki Employee ilişkiyi değiştirmek, birincil anahtarın EmployeeProjectgüncelleştirilip güncelleştirilmeye gerek duymayabileceği görünebilir. Ancak, bu durum mevcut bir silme ve yeni EmployeeProjectbir EmployeeProject 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

Ayrıca bkz.