Útmutató: Adatbázis-kapcsolatok leképezése
Az entitásosztályban tulajdonsághivatkozásként kódolhat minden olyan adatkapcsolatot, amely mindig ugyanaz lesz. A Northwind mintaadatbázisban például, mivel az ügyfelek általában megrendeléseket adnak le, a modellben mindig van kapcsolat az ügyfelek és a rendeléseik között.
A LINQ to SQL egy AssociationAttribute attribútumot határoz meg az ilyen kapcsolatok ábrázolásához. Ezt az attribútumot a rendszer az EntitySet<TEntity> adatbázis idegenkulcs-kapcsolatát ábrázoló típusokkal EntityRef<TEntity> együtt használja. További információt az Attribútumalapú leképezés társítási attribútum szakaszában talál.
Feljegyzés
Az AssociationAttribute és a ColumnAttribute Storage tulajdonság értékei megkülönböztetik a kis- és nagybetűket. Győződjön meg például arról, hogy az AssociationAttribute.Storage tulajdonság attribútumában használt értékek megegyeznek a kód más részein használt megfelelő tulajdonságnevek esetével. Ez az összes .NET-programozási nyelvre vonatkozik, még azokra is, amelyek általában nem érzékenyek a kis- és nagybetűkre, beleértve a Visual Basicet is. További információ a Storage tulajdonságról: DataAttribute.Storage.
A legtöbb kapcsolat egy-a-többhöz típusú, ahogyan a jelen témakör későbbi részében látható példában is látható. Az egy-az-egyhez és a több-a-többhöz kapcsolatokat az alábbiak szerint is jelölheti:
Egy-az-egyhez: Az ilyen típusú kapcsolatok ábrázolása EntitySet<TEntity> mindkét oldalon.
Vegyük például egy
Customer
-SecurityCode
olyan kapcsolatot, amely azért jött létre, hogy az ügyfél biztonsági kódja ne legyen megtalálható aCustomer
táblában, és csak a jogosult személyek férhetnek hozzá.Több-a-többhöz: A több-a-többhöz kapcsolatokban a kapcsolattábla elsődleges kulcsát (más néven elágazási táblát) gyakran a másik két tábla idegen kulcsainak összetettsége alkotja.
Fontolja meg például a
Employee
-Project
hivatkozástáblaEmployeeProject
használatával létrehozott több-a-többhöz kapcsolatot. Az SQL-hez való LINQ megköveteli, hogy egy ilyen kapcsolat három osztály használatával modellezhető legyen:Employee
,Project
ésEmployeeProject
. Ebben az esetben úgy tűnhet, hogy az egyikEmployee
és a kettőProject
közötti kapcsolat módosítása szükségessé teszi az elsődleges kulcsEmployeeProject
frissítését. Ez a helyzet azonban a legjobban úgy modellezhető, mint egy meglévőEmployeeProject
törlése és egy újEmployeeProject
létrehozása.Feljegyzés
A relációs adatbázisok kapcsolatait általában külső kulcsértékekként modellezheti, amelyek más táblák elsődleges kulcsára hivatkoznak. A közöttük való navigáláshoz explicit módon társítja a két táblát egy relációs illesztési művelettel.
A LINQ-ból SQL-be helyezett objektumok viszont tulajdonsághivatkozások vagy hivatkozásgyűjtemények használatával hivatkoznak egymásra, amelyeket pont jelöléssel navigál.
1. példa
Az alábbi egy-a-többhöz példában az Customer
osztály rendelkezik egy olyan tulajdonságkal, amely deklarálja az ügyfelek és rendeléseik közötti kapcsolatot. A Orders
tulajdonság típusa EntitySet<TEntity>. Ez a típus azt jelzi, hogy ez a kapcsolat egy-a-többhöz (egy ügyfél a több megrendeléshez). A OtherKey tulajdonság a társítás végrehajtásának leírására szolgál, nevezetesen a tulajdonság nevének megadásával a kapcsolódó osztályban, amelyet ehhez az osztályhoz kell hasonlítani. Ebben a példában a CustomerID
tulajdonságot hasonlítjuk össze, ahogyan az adatbázis-illesztés is összehasonlítaná ezt az oszlopértéket.
Feljegyzés
Ha Visual Studio-t használ, az Objektumrelációs tervezővel társíthatja az osztályokat.
[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
2. példa
A helyzetet megfordíthatja is. Az osztály helyett használhatja az Customer
osztályt az ügyfelek és a rendelések közötti társítás leírására Order
. Az Order
osztály a EntityRef<TEntity> típus használatával írja le az ügyféllel való kapcsolatot, ahogyan az alábbi kód példában is látható.
Feljegyzés
Az EntityRef<TEntity> osztály támogatja a késleltetett betöltést. További információ: Halasztott és azonnali betöltés.
[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