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 Blog
Post
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 Blogs
Id
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 Posts
być 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.Id
i właściwość klucza obcego Post
Post.BlogId
klasy , 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:
- Klucze obce i główne w relacjach, które obejmują sposób mapowania kluczy obcych na bazę danych.
- Nawigacje po relacjach, w których opisano, jak nawigacja jest nakładana na klucz obcy, aby zapewnić obiektowy widok relacji.
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
SaveChanges
SaveChangesAsync
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:
- Relacje mogą służyć do wykonywania zapytań dotyczących powiązanych danych na dowolny z trzech sposobów:
- Relacje mogą być używane w rozmieszczaniu danych przez dopasowywanie wartości PK do wartości FK.
- Relacje mogą służyć do śledzenia grafów jednostek. Relacje są następnie używane przez monitor zmian do:
- Wykrywanie zmian w relacjach i wykonywanie poprawek
- Wysyłanie aktualizacji klucza obcego do bazy danych za pomocą
SaveChanges
polecenia lubSaveChangesAsync