Procedure: Databaserelaties toewijzen
U kunt coderen als eigenschapsverwijzingen in uw entiteitsklasse, alle gegevensrelaties die altijd hetzelfde zijn. In de voorbeelddatabase Northwind, bijvoorbeeld omdat klanten doorgaans orders plaatsen, is er altijd een relatie in het model tussen klanten en hun orders.
LINQ naar SQL definieert een AssociationAttribute kenmerk om dergelijke relaties aan te geven. Dit kenmerk wordt samen met de EntitySet<TEntity> en EntityRef<TEntity> typen gebruikt om aan te geven wat een refererende-sleutelrelatie in een database zou zijn. Zie de sectie Koppelingskenmerk van kenmerktoewijzing op basis van kenmerken voor meer informatie.
Notitie
De eigenschapswaarden AssociationAttribute en ColumnAttribute Storage zijn hoofdlettergevoelig. Zorg er bijvoorbeeld voor dat waarden die worden gebruikt in het kenmerk voor de eigenschap AssociationAttribute.Storage overeenkomen met het geval voor de bijbehorende eigenschapsnamen die elders in de code worden gebruikt. Dit geldt voor alle .NET-programmeertalen, zelfs voor programmeertalen die doorgaans niet hoofdlettergevoelig zijn, waaronder Visual Basic. Zie voor meer informatie over de eigenschap DataAttribute.StorageStorage.
De meeste relaties zijn een-op-veel, zoals in het voorbeeld verderop in dit onderwerp. U kunt ook een-op-een- en veel-op-veel-relaties als volgt vertegenwoordigen:
Een-op-een: vertegenwoordig dit soort relatie door aan beide zijden op te geven EntitySet<TEntity> .
Denk bijvoorbeeld aan een
Customer
-SecurityCode
relatie die is gemaakt, zodat de beveiligingscode van de klant niet in deCustomer
tabel wordt gevonden en alleen toegankelijk is voor geautoriseerde personen.Veel-op-veel: In veel-op-veel-relaties wordt de primaire sleutel van de koppelingstabel (ook wel de verbindingstabel genoemd) vaak gevormd door een samengestelde van de refererende sleutels uit de andere twee tabellen.
Denk bijvoorbeeld aan een
Employee
-Project
veel-op-veel-relatie die wordt gevormd met behulp van een koppelingstabel.EmployeeProject
LINQ naar SQL vereist dat een dergelijke relatie wordt gemodelleerd met behulp van drie klassen:Employee
,Project
enEmployeeProject
. In dit geval kan het wijzigen van de relatie tussen eenEmployee
en eenProject
kan lijken om een update van de primaire sleutelEmployeeProject
te vereisen. Deze situatie is echter het beste gemodelleerd als het verwijderen van een bestaandeEmployeeProject
en het maken van een nieuweEmployeeProject
.Notitie
Relaties in relationele databases worden doorgaans gemodelleerd als refererende sleutelwaarden die verwijzen naar primaire sleutels in andere tabellen. Als u tussen deze tabellen wilt navigeren, koppelt u de twee tabellen expliciet met behulp van een relationele join-bewerking .
Objecten in LINQ naar SQL verwijzen daarentegen naar elkaar met behulp van eigenschapsverwijzingen of verzamelingen verwijzingen die u navigeert met behulp van punt notatie.
Voorbeeld 1
In het volgende een-op-veel-voorbeeld heeft de Customer
klasse een eigenschap die de relatie tussen klanten en hun orders declareert. De Orders
eigenschap is van het type EntitySet<TEntity>. Dit type geeft aan dat deze relatie een-op-veel is (één klant tot veel orders). De OtherKey eigenschap wordt gebruikt om te beschrijven hoe deze koppeling wordt bereikt, namelijk door de naam van de eigenschap in de gerelateerde klasse op te geven die moet worden vergeleken met deze. In dit voorbeeld wordt de CustomerID
eigenschap vergeleken, net zoals een databasedeelname die kolomwaarde vergelijkt.
Notitie
Als u Visual Studio gebruikt, kunt u de Object Relational Designer gebruiken om een koppeling tussen klassen te maken.
[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
Voorbeeld 2
U kunt de situatie ook omkeren. In plaats van de Customer
klasse te gebruiken om de koppeling tussen klanten en orders te beschrijven, kunt u de Order
klasse gebruiken. De Order
klasse gebruikt het EntityRef<TEntity> type om de relatie terug te beschrijven naar de klant, zoals in het volgende codevoorbeeld.
Notitie
De EntityRef<TEntity> klasse ondersteunt uitgestelde laadtijden. Zie Deferred versus Direct laden voor meer informatie.
[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