Wprowadzenie do relacji

Ten dokument zawiera proste wprowadzenie do reprezentacji relacji w modelach obiektów i relacyjnych bazach danych, w tym o sposobie mapowania programu EF Core 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ć reprezentowany jako kolekcja Post obiektów w każdym obiekcie Blog:

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

    public ICollection<Post> Posts { get; }
}

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

Ważne

Pojedyncza relacja może 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.

Napiwek

W programie EF Core Blog.Posts właściwości 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 Posts relacyjnym tabele i Blogs otrzymują kolumnę "klucz podstawowy". Wartość klucza podstawowego jednoznacznie identyfikuje każdy wpis lub blog. Ponadto Posts tabela ma kolumnę "klucz obcy". Kolumna BlogsId klucza podstawowego odwołuje się do kolumny BlogId klucza obcego Posts tabeli. Ta kolumna jest "ograniczona", tak aby każda wartość w BlogId kolumnie musi Postsbyć zgodna z wartością w Id kolumnie .Blogs To dopasowanie określa, który blog jest powiązany z każdym wpisem. Jeśli na przykład BlogId wartość w jednym wierszu Posts tabeli wynosi 7, wpis reprezentowany przez ten wiersz jest publikowany w blogu z kluczem podstawowym 7.

Mapowanie relacji w programie EF Core

Mapowanie relacji platformy EF Core dotyczy mapowania reprezentacji klucza podstawowego/klucza obcego używanego w relacyjnej bazie danych do odwołań między obiektami używanymi w modelu obiektów.

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 odwołań między typami jednostek z kluczami podstawowymi i obcymi w celu utworzenia konfiguracji pojedynczej 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 w przypadku relacji więcej niż mapowania. 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; }
}

Napiwek

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.Idi właściwość klucza obcego PostPost.BlogIdklasy , może być następnie skojarzona z odwołaniami ("nawigacje") między typami jednostek (Blog.Posts i Post.Blog). Jest to wykonywane automatycznie przez program EF podczas tworzenia prostej relacji podobnej do tej, ale można również jawnie określić podczas zastępowania OnModelCreating metody .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óbujesz użyć przykładów połączonych w powyższych punktach punktowych, 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ą wiernością, aby skonfigurować każdy aspekt modelu EF.

Inne tematy związane z relacjami obejmują:

  • Usuwanie kaskadowe, które opisuje sposób automatycznego usuwania powiązanych jednostek, gdy SaveChangesSaveChangesAsync lub jest wywoływana.
  • Typy jednostek należących używają specjalnego typu relacji "właścicieli", która 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.

Napiwek

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: