Megosztás a következőn keresztül:


Ú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ó a Customer 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ábla EmployeeProjecthaszná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és EmployeeProject. Ebben az esetben úgy tűnhet, hogy az egyik Employee és a kettő Project közötti kapcsolat módosítása szükségessé teszi az elsődleges kulcs EmployeeProjectfrissítését. Ez a helyzet azonban a legjobban úgy modellezhető, mint egy meglévő EmployeeProject törlése és egy új EmployeeProjectlé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

Lásd még