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


A kapcsolatok bemutatása

Ez a dokumentum egyszerű bevezetést nyújt az objektummodellekben és a relációs adatbázisokban lévő kapcsolatok ábrázolásához, beleértve azt is, hogy az EF Core hogyan térképezi le a kettőt.

Kapcsolatok objektummodellekben

A kapcsolat meghatározza, hogy két entitás hogyan viszonyul egymáshoz. Ha például egy blog bejegyzéseit modellezi, minden bejegyzés ahhoz a bloghoz kapcsolódik, amelyen közzé van téve, és a blog az adott blogon közzétett összes bejegyzéshez kapcsolódik.

A C#-hez hasonló objektumorientált nyelvben a blogot és a bejegyzést általában két osztály képviseli: Blog és Post. Például:

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }
}
public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }
}

A fenti osztályokban semmi sem utal arra, hogy Blog és Post kapcsolódnak. Ez az objektummodellhez úgy adható hozzá, hogy egy hivatkozást adunk a Post-ról arra a Blog-re, amelyen közzé van téve.

public class Post
{
    public string Title { get; set; }
    public string Content { get; set; }
    public DateOnly PublishedOn { get; set; }
    public bool Archived { get; set; }

    public Blog Blog { get; set; }
}

Hasonlóképpen, ugyanannak a kapcsolatnak az ellenkező iránya minden egyes Blog-en Post objektumok gyűjteményeként jelenhet meg.

public class Blog
{
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}

Az Blog és Post közötti, valamint az Post és Blog közötti kapcsolat az EF Core-ban "kapcsolatként" ismert.

Fontos

Egy egyetlen kapcsolat általában mindkét irányba bejárható. Ebben a példában a Blog a Blog.Posts tulajdonságon keresztül Post-be, és a Post a Post.Blog tulajdonságon keresztül vissza Blog-be. Ez egy kapcsolat , nem kettő.

Borravaló

Az EF Core-ban a Blog.Posts és Post.Blog tulajdonságokat "navigációnak" nevezzük.

Kapcsolatok relációs adatbázisokban

A relációs adatbázisok idegen kulcsokat használó kapcsolatokat jelölnek. Az SQL Server vagy az Azure SQL használatával például a következő táblák használhatók a Post és Blog osztályaink megjelenítésére:

CREATE TABLE [Posts] (
    [Id] int NOT NULL IDENTITY,
    [Title] nvarchar(max) NULL,
    [Content] nvarchar(max) NULL,
    [PublishedOn] datetime2 NOT NULL,
    [Archived] bit NOT NULL,
    [BlogId] int NOT NULL,
    CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE);

CREATE TABLE [Blogs] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NULL,
    [SiteUri] nvarchar(max) NULL,
    CONSTRAINT [PK_Blogs] PRIMARY KEY ([Id]));

Ebben a relációs modellben a Posts és Blogs táblák mindegyike egy "elsődleges kulcs" oszlopot kap. Az elsődleges kulcs értéke egyedileg azonosítja az egyes bejegyzéseket vagy blogokat. Emellett a Posts tábla egy "idegenkulcs" oszlopot is kap. Az Blogs elsődleges kulcs oszlopára Id a Posts tábla BlogId idegenkulcs-oszlopa hivatkozik. Ez az oszlop "korlátozott", így a PostsBlogId oszlopának minden értékének egyeznie kell a BlogsId oszlopában lévő értékkel. Ez a találat határozza meg, hogy melyik bloghoz kapcsolódik minden bejegyzés. Ha például a Posts tábla egyik sorában a BlogId értéke 7, akkor az adott sor által képviselt bejegyzés a blogban lesz közzétéve a 7. elsődleges kulccsal.

Kapcsolatok leképezése az EF Core-ban

Az EF Core-kapcsolatleképezés lényege, hogy a relációs adatbázisban használt elsődleges kulcs-/idegenkulcs-reprezentáció megfeleltethető az objektummodellben használt objektumok közötti hivatkozásoknak.

A legalapvetőbb értelemben ez a következőket foglalja magában:

  • Elsődleges kulcstulajdonság hozzáadása minden entitástípushoz.
  • Idegenkulcs-tulajdonság hozzáadása egy entitástípushoz.
  • Az entitástípusok és az elsődleges és idegen kulcsok közötti hivatkozások társítása egyetlen kapcsolatkonfiguráció létrehozásához.

A leképezést követően az EF szükség szerint módosítja az idegenkulcs-értékeket, amikor az objektumok közötti hivatkozások megváltoznak, és szükség szerint módosítja az objektumok közötti hivatkozásokat, amikor az idegenkulcs-értékek megváltoznak.

Jegyzet

Az elsődleges kulcsokat nem csak kapcsolatok leképezésére használják. További információt a Kulcsok című témakörben talál.

A fent látható entitástípusok például frissíthetők elsődleges és idegen kulcstulajdonságokkal:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Uri SiteUri { get; set; }

    public ICollection<Post> Posts { get; }
}
public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishedOn { get; set; }
    public bool Archived { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Borravaló

Az elsődleges és az idegen kulcs tulajdonságainak nem kell az entitástípus nyilvánosan látható tulajdonságainak lenniük. Azonban még akkor is, ha a tulajdonságok rejtettek, fontos felismerni, hogy még mindig léteznek az EF-modellben.

A Blog, Blog.Idés a Postidegenkulcs-tulajdonságának elsődleges kulcstulajdonsága Post.BlogIdezután társítható az entitástípusok (Blog.Posts és Post.Blog) közötti hivatkozásokhoz ("navigációk"). Ezt az EF automatikusan elvégzi egy ilyen egyszerű kapcsolat létrehozásakor, de explicit módon is megadható a OnModelCreating metódusának felülírásakor a DbContext-ben. Például:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasMany(e => e.Posts)
        .WithOne(e => e.Blog)
        .HasForeignKey(e => e.BlogId)
        .HasPrincipalKey(e => e.Id);
}

Most ezek a tulajdonságok egységesen fognak viselkedni, mint a Blog és a Postközötti egyetlen kapcsolat ábrázolása.

További információ

Az EF számos különböző típusú kapcsolatot támogat, és számos különböző módon ábrázolhatja és konfigurálhatja ezeket a kapcsolatokat. A különböző típusú kapcsolatok példáinak megtekintéséhez tekintse meg a következőt:

Ha még nem ismerkedett az EF-sel, akkor a fenti felsoroláspontokban hivatkozott példák kipróbálása jó módszer a kapcsolatok működésének megismerésére.

A kapcsolatleképezésben részt vevő entitástípusok tulajdonságainak mélyebb megismeréséhez lásd:

Az EF-modellek három mechanizmus kombinációjával készülnek: konvenciók, leképezési attribútumok és a modellkészítő API. A legtöbb példa a modellkészítő API-t mutatja be. A többi lehetőséggel kapcsolatos további információkért lásd:

Fontos

A modellkészítő API az EF-modell végső igazságforrása – mindig elsőbbséget élvez a konvenció által felderített vagy leképezési attribútumok által meghatározott konfigurációval szemben. Ez az egyetlen olyan mechanizmus, amely teljes hűséggel konfigurálja az EF-modell minden aspektusát.

A kapcsolatokhoz kapcsolódó egyéb témakörök a következők:

  • Kaszkádolt törlés, amely leírja, hogyan törölhetők automatikusan a kapcsolódó entitások SaveChanges vagy SaveChangesAsync meghívásakor.
  • tulajdonosi entitástípusok egy speciális típusú "tulajdonosi" kapcsolatot használnak, amely erősebb kapcsolatot feltételez a két típus között, mint az itt tárgyalt "normál" kapcsolatok. A normál kapcsolatokhoz itt ismertetett fogalmak közül sok a saját tulajdonú kapcsolatokra kerül át. A saját tulajdonú kapcsolatoknak azonban saját speciális viselkedésük is van.

Borravaló

A használati terminológia megértéséhez tekintse meg a kapcsolati kifejezések szószedetét a dokumentáció elolvasásakor.

Kapcsolatok használata

A modellben definiált kapcsolatok különböző módokon használhatók. Például: