Udostępnij za pośrednictwem


Wprowadzenie do relacji

Ten dokument zawiera proste wprowadzenie do reprezentowania związków w modelach obiektowych i relacyjnych bazach danych, w tym jak EF Core mapuje między nimi.

Relacje w modelach obiektów

Relacja definiuje sposób, w jaki dwie jednostki odnoszą się do siebie nawzajem. Na przykład podczas modelowania wpisów w blogu każdy wpis jest powiązany z blogiem, na który jest publikowany, a blog jest powiązany ze wszystkimi wpisami opublikowanymi w tym blogu.

W języku obiektowym, na przykład C#, blog i wpis są zwykle reprezentowane przez dwie klasy: Blog i Post. Na przykład:

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; }
}

W powyższych klasach nie ma nic do wskazania, że Blog i Post są powiązane. Można go dodać do modelu obiektów, dodając odwołanie z Post do obiektu Blog , na którym jest publikowany:

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; }
}

Podobnie, odwrotny kierunek tej samej relacji może być przedstawiony jako zbiór Post obiektów na każdym Blog:

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

    public ICollection<Post> Posts { get; }
}

To połączenie z elementu Blog do Post i, odwrotnie, z elementu Post z powrotem do Blog jest znane jako "relacja" w programie EF Core.

Ważne

Relację pojedynczą można zwykle przechodzić w obu kierunkach. W tym przykładzie jest to z Blog do Post za pośrednictwem Blog.Posts właściwości i z Post powrotem do Blog za pośrednictwem Post.Blog właściwości . Jest to jedna relacja, a nie dwie.

Wskazówka

W programie EF Core właściwości Blog.Posts i Post.Blog są nazywane "nawigacjami".

Relacje w relacyjnych bazach danych

Relacyjne bazy danych reprezentują relacje przy użyciu kluczy obcych. Na przykład przy użyciu programu SQL Server lub usługi Azure SQL można użyć następujących tabel do reprezentowania naszych Post klas i Blog :

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]));

W tym modelu relacyjnym, tabele Posts i Blogs mają kolumnę "klucz podstawowy". Wartość klucza podstawowego jednoznacznie identyfikuje każdy wpis lub blog. Ponadto tabela Posts ma kolumnę "obcy klucz". Kolumna BlogsId klucza podstawowego jest referencjonowana przez kolumnę BlogId klucza obcego tabeli Posts. Ta kolumna jest "ograniczona", tak aby każda wartość w kolumnie BlogIdPosts musiała być zgodna z wartością w kolumnie IdBlogs. To dopasowanie określa, który blog jest powiązany z każdym wpisem. Jeśli na przykład wartość BlogId w danym wierszu tabeli Posts wynosi 7, to wpis reprezentowany przez ten wiersz jest publikowany w blogu o kluczu głównym 7.

Mapowanie relacji w programie EF Core

Mapowanie relacji w EF Core polega na mapowaniu reprezentacji klucza podstawowego/klucza obcego używanego w relacyjnej bazie danych na odwołania między obiektami w modelu obiektowym.

W najbardziej podstawowym sensie obejmuje to:

  • Dodawanie właściwości klucza podstawowego do każdego typu jednostki.
  • Dodawanie właściwości klucza obcego do jednego typu jednostki.
  • Kojarzenie referencji między typami jednostek z kluczami podstawowymi i obcymi w celu utworzenia jednolitej konfiguracji relacji.

Po wprowadzeniu tego mapowania program EF zmienia wartości klucza obcego zgodnie z potrzebami, gdy odwołania między obiektami się zmieniają, i zmienia odwołania między obiektami zgodnie z potrzebami w przypadku zmiany wartości klucza obcego.

Uwaga

Klucze podstawowe są używane nie tylko do mapowania relacji. Aby uzyskać więcej informacji, zobacz Klucze .

Na przykład powyższe typy jednostek można zaktualizować za pomocą właściwości klucza podstawowego i obcego:

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; }
}

Wskazówka

Właściwości klucza podstawowego i obcego nie muszą być publicznie widoczne właściwości typu jednostki. Jednak nawet jeśli właściwości są ukryte, należy pamiętać, że nadal istnieją w modelu EF.

Właściwość klucza podstawowego Blog, Blog.Id, oraz właściwość klucza obcego Post, Post.BlogId mogą następnie być skojarzone z odwołaniami ("nawigacje") między typami jednostek (Blog.Posts i Post.Blog). Jest to wykonywane automatycznie przez EF podczas tworzenia takiej prostej relacji, ale można to również jawnie określić, nadpisując metodę OnModelCreating w DbContext. Na przykład:

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);
}

Teraz wszystkie te właściwości będą zachowywać się spójnie razem jako reprezentacja pojedynczej relacji między Blog i Post.

Dowiedz się więcej

Program EF obsługuje wiele różnych typów relacji, z wieloma różnymi sposobami reprezentowania i konfigurowania tych relacji. Aby przejść do przykładów różnych rodzajów relacji, zobacz:

  • Relacje jeden do wielu, w których jedna jednostka jest skojarzona z dowolną liczbą innych jednostek.
  • Relacje jeden do jednego, w których jedna jednostka jest skojarzona z inną jednostką.
  • Relacje wiele-do-wielu, w których dowolna liczba jednostek jest skojarzona z dowolną liczbą innych jednostek.

Jeśli dopiero zaczynasz korzystać z platformy EF, spróbować użyć przykładów wymienionych w powyższych punktach wypunktowania to dobry sposób, aby dowiedzieć się, jak działają relacje.

Aby dokładniej zapoznać się z właściwościami typów jednostek zaangażowanych w mapowanie relacji, zobacz:

Modele EF są tworzone przy użyciu kombinacji trzech mechanizmów: konwencji, atrybutów mapowania i interfejsu API konstruktora modeli. Większość przykładów przedstawia interfejs API tworzenia modelu. Aby dowiedzieć się więcej o innych opcjach, zobacz:

  • Konwencje relacji, które odnajdują typy jednostek, ich właściwości i relacje między typami.
  • Atrybuty mapowania relacji, które mogą służyć jako alternatywa dla interfejsu API tworzenia modelu dla niektórych aspektów konfiguracji relacji.

Ważne

Interfejs API tworzenia modelu jest ostatnim źródłem prawdy dla modelu EF — zawsze ma pierwszeństwo przed konfiguracją odnalezioną zgodnie z konwencją lub określonymi przez atrybuty mapowania. Jest to również jedyny mechanizm z pełną zgodnością do konfigurowania każdego aspektu modelu EF.

Inne tematy związane z relacjami obejmują:

  • Usuwanie kaskadowe, które opisuje sposób automatycznego usuwania powiązanych jednostek, gdy zostanie wywołana SaveChanges lub SaveChangesAsync.
  • Typy jednostek własnościowych wykorzystują specjalny typ relacji "posiadania", który oznacza silniejsze połączenie między dwoma typami niż "normalne" relacje omówione tutaj. Wiele pojęć opisanych w tym miejscu dla normalnych relacji jest przenoszonych do relacji należących do właścicieli. Jednak relacje należące do użytkownika mają również własne specjalne zachowania.

Wskazówka

Zapoznaj się ze słownikiem terminów relacji zgodnie z potrzebami podczas czytania dokumentacji, aby ułatwić zrozumienie używanej terminologii.

Korzystanie z relacji

Relacje zdefiniowane w modelu mogą być używane na różne sposoby. Na przykład: