RelacjeRelationships

Relacja definiuje sposób dwie jednostki odnoszą się do siebie.A relationship defines how two entities relate to each other. W relacyjnej bazie danych to jest reprezentowany przez ograniczenie klucza obcego.In a relational database, this is represented by a foreign key constraint.

Uwaga

Większość przykładów w tym artykule umożliwiają pokazują pojęcia relacji jeden do wielu.Most of the samples in this article use a one-to-many relationship to demonstrate concepts. Przykłady relacje jeden do jednego oraz wiele do wielu można znaleźć inne wzorce relacji sekcji na końcu tego artykułu.For examples of one-to-one and many-to-many relationships see the Other Relationship Patterns section at the end of the article.

Definicje terminówDefinition of Terms

Liczba terminów używanych do opisywania relacjiThere are a number of terms used to describe relationships

  • Jednostki zależnej: to jednostka, która zawiera właściwości klucza obcego.Dependent entity: This is the entity that contains the foreign key property(s). Czasami określane jako 'child' relacji.Sometimes referred to as the 'child' of the relationship.

  • Jednostka główna: to jednostka, która zawiera właściwości klucza podstawowego/alternatywny.Principal entity: This is the entity that contains the primary/alternate key property(s). Czasami określane jako "parent" w relacji.Sometimes referred to as the 'parent' of the relationship.

  • Klucz obcy: właściwości w jednostki zależnej, który jest używany do przechowywania wartości właściwości klucza głównej powiązanej jednostki.Foreign key: The property(s) in the dependent entity that is used to store the values of the principal key property that the entity is related to.

  • Klucz główny: właściwości, który unikatowo identyfikuje jednostki podmiotu zabezpieczeń.Principal key: The property(s) that uniquely identifies the principal entity. Może to być kluczem podstawowym lub unikatowym.This may be the primary key or an alternate key.

  • Właściwość nawigacji: właściwość zdefiniowaną w głównych i/lub zależnych jednostki, która zawiera odwołania do powiązanych entity(s).Navigation property: A property defined on the principal and/or dependent entity that contains a reference(s) to the related entity(s).

    • Właściwości nawigacji kolekcji: właściwość nawigacji, który zawiera odwołania do wielu powiązanych jednostek.Collection navigation property: A navigation property that contains references to many related entities.

    • Właściwości nawigacji odwołania: właściwość nawigacji, który zawiera odwołanie do jednego obiektu pokrewnego.Reference navigation property: A navigation property that holds a reference to a single related entity.

    • Odwrócona właściwość nawigacji: Omawiając właściwości nawigacji w szczególności, określenie to odnosi się do właściwości nawigacji na drugim końcu relacji.Inverse navigation property: When discussing a particular navigation property, this term refers to the navigation property on the other end of the relationship.

Następujący przykładowy kod przedstawia relacji jeden do wielu między Blog iPostThe following code listing shows a one-to-many relationship between Blog and Post

  • Postjest jednostki zależnejPost is the dependent entity

  • Blogjest główną jednostkiBlog is the principal entity

  • Post.BlogIdjest kluczem obcymPost.BlogId is the foreign key

  • Blog.BlogIdjest to klucz główny (w tym przypadku jest kluczem podstawowym, a nie klucza alternatywnego)Blog.BlogId is the principal key (in this case it is a primary key rather than an alternate key)

  • Post.Blogjest właściwością nawigacji odwołaniaPost.Blog is a reference navigation property

  • Blog.Postsjest właściwością nawigacji kolekcjiBlog.Posts is a collection navigation property

  • Post.Blogjest odwróconą właściwość nawigacji z Blog.Posts (i na odwrót)Post.Blog is the inverse navigation property of Blog.Posts (and vice versa)

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

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

KonwencjeConventions

Według konwencji będzie można utworzyć relacji, po wykryte na typ właściwości nawigacji.By convention, a relationship will be created when there is a navigation property discovered on a type. Właściwość jest traktowany jako właściwość nawigacji, jeśli nie można zamapować typu, który wskazuje jako typem skalarnym przez bieżącego dostawcę bazy danych.A property is considered a navigation property if the type it points to can not be mapped as a scalar type by the current database provider.

Uwaga

Relacje, które zostały wykryte przez Konwencję zawsze będzie obowiązywać klucza podstawowego jednostki podmiotu zabezpieczeń.Relationships that are discovered by convention will always target the primary key of the principal entity. Pod kątem klucza alternatywnego, należy wykonać dodatkowe czynności konfiguracyjne przy użyciu interfejsu API Fluent.To target an alternate key, additional configuration must be performed using the Fluent API.

Relacje zdefiniowane w pełniFully Defined Relationships

Najbardziej typowe wzorca dla relacji jest zdefiniowany po obu stronach relacji i właściwości klucza obcego zdefiniowana w klasie jednostki zależnej właściwości nawigacji.The most common pattern for relationships is to have navigation properties defined on both ends of the relationship and a foreign key property defined in the dependent entity class.

  • Jeśli między dwoma typami para właściwości nawigacji, następnie one zostanie skonfigurowany jako właściwości nawigacji odwrotny tej samej relacji.If a pair of navigation properties is found between two types, then they will be configured as inverse navigation properties of the same relationship.

  • Jeśli jednostki zależnej zawiera właściwość o nazwie <primary key property name>, <navigation property name><primary key property name>, lub <principal entity name><primary key property name> , a następnie zostaną skonfigurowane jako klucz obcy.If the dependent entity contains a property named <primary key property name>, <navigation property name><primary key property name>, or <principal entity name><primary key property name> then it will be configured as the foreign key.

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

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

Ostrzeżenie

Jeśli istnieje wiele właściwości nawigacji zdefiniowane między dwoma typami (tj. więcej niż jedną parę różne nawigacji wskazujące ze sobą), następnie relacje nie zostaną utworzone przez Konwencję i konieczne będzie ręczne skonfigurowanie ich do identyfikacji sposób pary właściwości nawigacji.If there are multiple navigation properties defined between two types (i.e. more than one distinct pair of navigations that point to each other), then no relationships will be created by convention and you will need to manually configure them to identify how the navigation properties pair up.

Nie właściwości klucza obcegoNo Foreign Key Property

Gdy jest zalecane, aby mieć zdefiniowany w klasie jednostki zależnej właściwości klucza obcego, nie jest wymagane.While it is recommended to have a foreign key property defined in the dependent entity class, it is not required. Przypadku nieznalezienia ma właściwości klucza obcego, zostaną wprowadzone tle właściwości klucza obcego o nazwie <navigation property name><principal key property name> (zobacz właściwości tle Aby uzyskać więcej informacji).If no foreign key property is found, a shadow foreign key property will be introduced with the name <navigation property name><principal key property name> (see Shadow Properties for more information).

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

Właściwości pojedynczej wartościSingle Navigation Property

Łącznie z tylko jedną właściwość nawigacji (nie odwrotny nawigacji i ma właściwości klucza obcego) jest wystarczająca do zdefiniowano relacji w Konwencji.Including just one navigation property (no inverse navigation, and no foreign key property) is enough to have a relationship defined by convention. Można również mieć właściwości pojedynczej wartości i właściwości klucza obcego.You can also have a single navigation property and a foreign key property.

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
}

Usuwanie kaskadoweCascade Delete

Konwencja, usuwanie kaskadowe zostanie ustawiona do Cascade dla relacji wymagane i ClientSetNull dla relacji opcjonalne.By convention, cascade delete will be set to Cascade for required relationships and ClientSetNull for optional relationships. CASCADE oznacza jednostki zależne, również zostaną usunięte.Cascade means dependent entities are also deleted. ClientSetNull oznacza, że pozostanie jednostek zależnych, które nie zostały załadowane do pamięci bez zmian i muszą być ręcznie usunięty lub zaktualizowany w celu wskaż prawidłową jednostkę podmiotu zabezpieczeń.ClientSetNull means that dependent entities that are not loaded into memory will remain unchanged and must be manually deleted, or updated to point to a valid principal entity. Dla obiektów, które są ładowane do pamięci EF Core będzie podejmować próby ustaw wartość null z właściwości klucza obcego.For entities that are loaded into memory, EF Core will attempt to set the foreign key properties to null.

Zobacz wymaganych i opcjonalnych relacje sekcji różnicę między relacje wymaganych i opcjonalnych.See the Required and Optional Relationships section for the difference between required and optional relationships.

Zobacz Cascade Delete więcej informacji na temat różnych Usuń zachowania i wartości domyślne używane przez Konwencję.See Cascade Delete for more details about the different delete behaviors and the defaults used by convention.

Adnotacji danychData Annotations

Istnieją dwa adnotacji danych, które mogą służyć do konfigurowania relacji, [ForeignKey] i [InverseProperty].There are two data annotations that can be used to configure relationships, [ForeignKey] and [InverseProperty].

[ForeignKey][ForeignKey]

Adnotacje danych służy do konfigurowania właściwości, które należy używać jako właściwość klucza obcego w określonej relacji.You can use the Data Annotations to configure which property should be used as the foreign key property for a given relationship. Jest to zazwyczaj wykonywane, gdy właściwość klucza obcego nie zostanie wykryta przez Konwencję.This is typically done when the foreign key property is not discovered by convention.

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogForeignKey { get; set; }

    [ForeignKey("BlogForeignKey")]
    public Blog Blog { get; set; }
}

Porada

[ForeignKey] Adnotacji można umieścić we właściwości nawigacji, albo w relacji.The [ForeignKey] annotation can be placed on either navigation property in the relationship. Nie trzeba go we właściwości nawigacji w klasie jednostki zależnej.It does not need to go on the navigation property in the dependent entity class.

[InverseProperty][InverseProperty]

Adnotacje danych służy do konfigurowania, jak pary właściwości nawigacji jednostki zależnej i głównej.You can use the Data Annotations to configure how navigation properties on the dependent and principal entities pair up. Jest to zazwyczaj wykonywane, gdy istnieje więcej niż jedna para właściwości nawigacji między dwoma typami jednostek.This is typically done when there is more than one pair of navigation properties between two entity types.

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int AuthorUserId { get; set; }
    public User Author { get; set; }

    public int ContributorUserId { get; set; }
    public User Contributor { get; set; }
}

public class User
{
    public string UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [InverseProperty("Author")]
    public List<Post> AuthoredPosts { get; set; }

    [InverseProperty("Contributor")]
    public List<Post> ContributedToPosts { get; set; }
}

Interfejsu API FluentFluent API

Aby skonfigurować relację w interfejsie API Fluent, należy uruchomić, określając właściwości nawigacji, które tworzą relacji.To configure a relationship in the Fluent API, you start by identifying the navigation properties that make up the relationship. HasOnelub HasMany identyfikuje właściwość nawigacji typu jednostki są od konfiguracji na.HasOne or HasMany identifies the navigation property on the entity type you are beginning the configuration on. Następnie łańcucha wywołania WithOne lub WithMany do identyfikowania odwrotny nawigacji.You then chain a call to WithOne or WithMany to identify the inverse navigation. HasOne/WithOnesą używane dla właściwości nawigacji odwołania oraz HasMany / WithMany są używane w przypadku właściwości nawigacji kolekcji.HasOne/WithOne are used for reference navigation properties and HasMany/WithMany are used for collection navigation properties.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

Właściwości pojedynczej wartościSingle Navigation Property

Jeśli masz tylko jedną właściwość nawigacji, istnieją przeciążenia bez parametrów metody WithOne i WithMany.If you only have one navigation property then there are parameterless overloads of WithOne and WithMany. Oznacza to, że jest koncepcyjnie odwołania lub kolekcji na końcu relacji, ale nie ma właściwości nawigacji zawarte w klasie jednostki.This indicates that there is conceptually a reference or collection on the other end of the relationship, but there is no navigation property included in the entity class.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasMany(b => b.Posts)
            .WithOne();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
}

Klucz obcyForeign Key

Interfejsu API Fluent służy do konfigurowania właściwości, które należy używać jako właściwość klucza obcego w określonej relacji.You can use the Fluent API to configure which property should be used as the foreign key property for a given relationship.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogForeignKey);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

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

Następujący przykładowy kod przedstawia sposób konfigurowania złożonych kluczy obcych.The following code listing shows how to configure a composite foreign key.

class MyContext : DbContext
{
    public DbSet<Car> Cars { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>()
            .HasKey(c => new { c.State, c.LicensePlate });

        modelBuilder.Entity<RecordOfSale>()
            .HasOne(s => s.Car)
            .WithMany(c => c.SaleHistory)
            .HasForeignKey(s => new { s.CarState, s.CarLicensePlate });
    }
}

public class Car
{
    public string State { get; set; }
    public string LicensePlate { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }

    public List<RecordOfSale> SaleHistory { get; set; }
}

public class RecordOfSale
{
    public int RecordOfSaleId { get; set; }
    public DateTime DateSold { get; set; }
    public decimal Price { get; set; }

    public string CarState { get; set; }
    public string CarLicensePlate { get; set; }
    public Car Car { get; set; }
}

Można użyć ciągu przeciążenia HasForeignKey(...) do skonfigurowania właściwości w tle jako klucz obcy (zobacz właściwości tle Aby uzyskać więcej informacji).You can use the string overload of HasForeignKey(...) to configure a shadow property as a foreign key (see Shadow Properties for more information). Firma Microsoft zaleca jawnie dodawania właściwości cień do modelu, przed użyciem go jako klucz obcy (jak pokazano poniżej).We recommend explicitly adding the shadow property to the model before using it as a foreign key (as shown below).

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Add the shadow property to the model
        modelBuilder.Entity<Post>()
            .Property<int>("BlogForeignKey");

        // Use the shadow property as a foreign key
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey("BlogForeignKey");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

Klucza podmiotuPrincipal Key

Jeśli chcesz, aby klucz obcy do odwołania właściwości innych niż klucz podstawowy, można użyć interfejsu API Fluent do skonfigurowania właściwości klucza podmiotu zabezpieczeń dla tej relacji.If you want the foreign key to reference a property other than the primary key, you can use the Fluent API to configure the principal key property for the relationship. Właściwość, którą można skonfigurować jako główny klucza zostanie automatycznie, należy skonfigurować jako klucza alternatywnego (zobacz klucze alternatywne Aby uzyskać więcej informacji).The property that you configure as the principal key will automatically be setup as an alternate key (see Alternate Keys for more information).

class MyContext : DbContext
{
    public DbSet<Car> Cars { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RecordOfSale>()
            .HasOne(s => s.Car)
            .WithMany(c => c.SaleHistory)
            .HasForeignKey(s => s.CarLicensePlate)
            .HasPrincipalKey(c => c.LicensePlate);
    }
}

public class Car
{
    public int CarId { get; set; }
    public string LicensePlate { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }

    public List<RecordOfSale> SaleHistory { get; set; }
}

public class RecordOfSale
{
    public int RecordOfSaleId { get; set; }
    public DateTime DateSold { get; set; }
    public decimal Price { get; set; }

    public string CarLicensePlate { get; set; }
    public Car Car { get; set; }
}

Następujący przykładowy kod przedstawia sposób konfigurowania złożonych kluczy głównych.The following code listing shows how to configure a composite principal key.

class MyContext : DbContext
{
    public DbSet<Car> Cars { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RecordOfSale>()
            .HasOne(s => s.Car)
            .WithMany(c => c.SaleHistory)
            .HasForeignKey(s => new { s.CarState, s.CarLicensePlate })
            .HasPrincipalKey(c => new { c.State, c.LicensePlate });
    }
}

public class Car
{
    public int CarId { get; set; }
    public string State { get; set; }
    public string LicensePlate { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }

    public List<RecordOfSale> SaleHistory { get; set; }
}

public class RecordOfSale
{
    public int RecordOfSaleId { get; set; }
    public DateTime DateSold { get; set; }
    public decimal Price { get; set; }

    public string CarState { get; set; }
    public string CarLicensePlate { get; set; }
    public Car Car { get; set; }
}

Ostrzeżenie

Kolejność, w którym należy określić główny właściwości klucza muszą być zgodne kolejność, w którym są określone dla klucza obcego.The order in which you specify principal key properties must match the order in which they are specified for the foreign key.

Relacje wymaganych i opcjonalnychRequired and Optional Relationships

Aby określić, czy relacja jest wymagany lub opcjonalny, można użyć interfejsu API Fluent.You can use the Fluent API to configure whether the relationship is required or optional. Ostatecznie to określa, czy właściwość klucza obcego jest wymagany lub opcjonalny.Ultimately this controls whether the foreign key property is required or optional. Jest to użyteczna, gdy używasz klucz obcy Stan cienia.This is most useful when you are using a shadow state foreign key. Jeśli masz właściwości klucza obcego w klasie jednostki, requiredness relacji jest określany na podstawie tego, czy właściwość klucza obcego jest wymagany lub opcjonalny (zobacz właściwości wymaganych i opcjonalnych Aby uzyskać więcej informacji informacje).If you have a foreign key property in your entity class then the requiredness of the relationship is determined based on whether the foreign key property is required or optional (see Required and Optional properties for more information).

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .IsRequired();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

Usuwanie kaskadoweCascade Delete

Można użyć interfejsu API Fluent jawnie skonfigurować zachowanie usuwania kaskadowego określonej relacji.You can use the Fluent API to configure the cascade delete behavior for a given relationship explicitly.

Zobacz Cascade Delete w sekcji zapisywania danych szczegółowe omówienie każdej z nich.See Cascade Delete on the Saving Data section for a detailed discussion of each option.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

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

Innymi wzorami relacjiOther Relationship Patterns

Jeden do jednegoOne-to-one

Relacje jeden-do-jednego ma właściwości nawigacji odwołania po obu stronach.One to one relationships have a reference navigation property on both sides. Wykonaj one tej samej Konwencji jako relacji jeden do wielu, ale wprowadzono unikatowego indeksu na właściwość klucza obcego w celu zapewnienia, że tylko jeden zależne od powiązany jest każdy podmiot zabezpieczeń.They follow the same conventions as one-to-many relationships, but a unique index is introduced on the foreign key property to ensure only one dependent is related to each principal.

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }

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

Uwaga

EF wybrać jeden jednostek jako zależnego oparte na możliwość wykrywania właściwości klucza obcego.EF will choose one of the entities to be the dependent based on its ability to detect a foreign key property. Jeśli niewłaściwy jednostki jest wybrany jako zależnego, można użyć interfejsu API Fluent, aby rozwiązać ten problem.If the wrong entity is chosen as the dependent, you can use the Fluent API to correct this.

Podczas konfigurowania relacji z interfejsu API Fluent, użyj HasOne i WithOne metody.When configuring the relationship with the Fluent API, you use the HasOne and WithOne methods.

Podczas konfigurowania klucza obcego, należy określić typ jednostki zależnej — zauważyć przekazane do parametru ogólnego HasForeignKey na liście poniżej.When configuring the foreign key you need to specify the dependent entity type - notice the generic parameter provided to HasForeignKey in the listing below. W relacji jeden do wielu jest jasne, czy jednostka z nawigacji odwołania jest zależnego i z kolekcji jest podmiot zabezpieczeń.In a one-to-many relationship it is clear that the entity with the reference navigation is the dependent and the one with the collection is the principal. Ale nie jest tak w relacji jeden - dlatego trzeba jawnie definiować go.But this is not so in a one-to-one relationship - hence the need to explicitly define it.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<BlogImage> BlogImages { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasOne(p => p.BlogImage)
            .WithOne(i => i.Blog)
            .HasForeignKey<BlogImage>(b => b.BlogForeignKey);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }

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

Wiele do wieluMany-to-many

Relacje wiele do wielu bez klasę jednostki do reprezentowania tabeli sprzężenia nie są jeszcze obsługiwane.Many-to-many relationships without an entity class to represent the join table are not yet supported. Jednak może wymagać relacji wiele do wielu, umieszczając klasę jednostki dla tabeli sprzężenia i relacje jeden do wielu oddzielnych dwóch mapowania.However, you can represent a many-to-many relationship by including an entity class for the join table and mapping two separate one-to-many relationships.

class MyContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PostTag>()
            .HasKey(t => new { t.PostId, t.TagId });

        modelBuilder.Entity<PostTag>()
            .HasOne(pt => pt.Post)
            .WithMany(p => p.PostTags)
            .HasForeignKey(pt => pt.PostId);

        modelBuilder.Entity<PostTag>()
            .HasOne(pt => pt.Tag)
            .WithMany(t => t.PostTags)
            .HasForeignKey(pt => pt.TagId);
    }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public List<PostTag> PostTags { get; set; }
}

public class Tag
{
    public string TagId { get; set; }

    public List<PostTag> PostTags { get; set; }
}

public class PostTag
{
    public int PostId { get; set; }
    public Post Post { get; set; }

    public string TagId { get; set; }
    public Tag Tag { get; set; }
}