Anvisningar: Mappa databasrelationer
Du kan koda som egenskapsreferenser i entitetsklassen alla datarelationer som alltid kommer att vara desamma. I Northwind-exempeldatabasen finns det till exempel alltid en relation i modellen mellan kunder och deras beställningar eftersom kunderna vanligtvis gör beställningar.
LINQ till SQL definierar ett AssociationAttribute attribut för att representera sådana relationer. Det här attributet används tillsammans med typerna EntitySet<TEntity> och EntityRef<TEntity> för att representera vad som skulle vara en sekundärnyckelrelation i en databas. Mer information finns i avsnittet Associationsattribut i Attributbaserad mappning.
Kommentar
Egenskapsvärdena AssociationAttribute och ColumnAttribute Storage är skiftlägeskänsliga. Kontrollera till exempel att värden som används i attributet för egenskapen AssociationAttribute.Storage matchar fallet för motsvarande egenskapsnamn som används någon annanstans i koden. Detta gäller för alla .NET-programmeringsspråk, även de som vanligtvis inte är skiftlägeskänsliga, inklusive Visual Basic. Mer information om egenskapen Storage finns i DataAttribute.Storage.
De flesta relationer är en-till-många, som i exemplet senare i det här avsnittet. Du kan också representera en-till-en- och många-till-många-relationer på följande sätt:
En-till-en: Representera den här typen av relation genom att inkludera EntitySet<TEntity> på båda sidor.
Överväg till exempel en
Customer
-SecurityCode
relation som skapats så att kundens säkerhetskod inte hittas iCustomer
tabellen och endast kan nås av behöriga personer.Många-till-många: I många-till-många-relationer bildas ofta den primära nyckeln i länktabellen (även kallad kopplingstabellen) av en sammansatt av sekundärnycklarna från de andra två tabellerna.
Överväg till exempel en
Employee
-Project
många-till-många-relation som skapas med hjälp av länktabellenEmployeeProject
. LINQ till SQL kräver att en sådan relation modelleras med hjälp av tre klasser:Employee
,Project
ochEmployeeProject
. I det här fallet kan det verka som om en ändring av relationen mellan enEmployee
och enProject
kräver en uppdatering av primärnyckelnEmployeeProject
. Den här situationen modelleras dock bäst som att ta bort en befintligEmployeeProject
och skapa en nyEmployeeProject
.Kommentar
Relationer i relationsdatabaser modelleras vanligtvis som sekundärnyckelvärden som refererar till primära nycklar i andra tabeller. Om du vill navigera mellan dem associerar du uttryckligen de två tabellerna med hjälp av en relationskopplingsåtgärd.
Objekt i LINQ till SQL refererar å andra sidan till varandra med hjälp av egenskapsreferenser eller samlingar med referenser som du navigerar med hjälp av punkt notation.
Exempel 1
I följande exempel Customer
har klassen en egenskap som deklarerar relationen mellan kunder och deras beställningar. Egenskapen Orders
är av typen EntitySet<TEntity>. Den här typen betyder att den här relationen är en-till-många (en kund till många beställningar). Egenskapen OtherKey används för att beskriva hur den här associationen utförs, nämligen genom att ange namnet på egenskapen i den relaterade klassen som ska jämföras med den här. I det här exemplet jämförs CustomerID
egenskapen, precis som en databaskoppling skulle jämföra kolumnvärdet.
Kommentar
Om du använder Visual Studio kan du använda objektrelationsdesignern för att skapa en association mellan klasser.
[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
Exempel 2
Du kan också vända på situationen. I stället för att använda Customer
klassen för att beskriva associationen mellan kunder och beställningar kan du använda Order
klassen. Klassen Order
använder EntityRef<TEntity> typen för att beskriva relationen tillbaka till kunden, som i följande kodexempel.
Kommentar
Klassen EntityRef<TEntity> stöder uppskjuten inläsning. Mer information finns i Uppskjuten kontra Omedelbar inläsning.
[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