Udostępnij za pośrednictwem


Zapisywanie powiązanych danych

Oprócz izolowanych jednostek można również korzystać z relacji zdefiniowanych w modelu.

Wskazówka

Przykład z tego artykułu można zobaczyć w witrynie GitHub.

Dodawanie grafu nowych jednostek

Jeśli utworzysz kilka nowych powiązanych jednostek, dodanie jednej z nich do kontekstu spowoduje również dodanie innych jednostek.

W poniższym przykładzie blog i trzy powiązane wpisy są wstawione do bazy danych. Wpisy są znajdowane i dodawane, ponieważ są dostępne za pośrednictwem Blog.Posts właściwości nawigacji.

using (var context = new BloggingContext())
{
    var blog = new Blog
    {
        Url = "http://blogs.msdn.com/dotnet",
        Posts = new List<Post>
        {
            new Post { Title = "Intro to C#" },
            new Post { Title = "Intro to VB.NET" },
            new Post { Title = "Intro to F#" }
        }
    };

    context.Blogs.Add(blog);
    await context.SaveChangesAsync();
}

Wskazówka

Użyj właściwości EntityEntry.State, aby ustawić stan tylko jednej jednostki. Na przykład context.Entry(blog).State = EntityState.Modified.

Jeśli odwołujesz się do nowego obiektu z właściwości nawigacyjnej obiektu, który jest już śledzony przez kontekst, obiekt zostanie odkryty i dodany do bazy danych.

W poniższym przykładzie jednostka post jest wstawiana, ponieważ jest dodawana do Posts właściwości blog jednostki, która została pobrana z bazy danych.

using (var context = new BloggingContext())
{
    var blog = await context.Blogs.Include(b => b.Posts).FirstAsync();
    var post = new Post { Title = "Intro to EF Core" };

    blog.Posts.Add(post);
    await context.SaveChangesAsync();
}

Zmienianie relacji

Jeśli zmienisz właściwość nawigacji jednostki, odpowiednie zmiany zostaną wprowadzone w kolumnie klucza obcego w bazie danych.

W poniższym przykładzie jednostka post jest aktualizowana, aby należeć do nowej jednostki blog, ponieważ jej właściwość nawigacji Blog jest ustawiona na blog. Należy również pamiętać, że blog zostanie wstawiony do bazy danych, ponieważ jest to nowa jednostka, do której odnosi się właściwość nawigacji jednostki już śledzonej przez kontekst (post).

using (var context = new BloggingContext())
{
    var blog = new Blog { Url = "http://blogs.msdn.com/visualstudio" };
    var post = await context.Posts.FirstAsync();

    post.Blog = blog;
    await context.SaveChangesAsync();
}

Usuwanie relacji

Relację można usunąć, ustawiając nawigację referencyjną na null, lub usuwając powiązaną jednostkę z nawigacji kolekcji.

Usunięcie relacji może mieć skutki uboczne dla obiektu zależnego, zgodnie z zasadą kaskadowego usuwania skonfigurowaną w relacji.

Domyślnie w przypadku wymaganych relacji jest skonfigurowane zachowanie usuwania kaskadowego, a jednostka podrzędna/zależna zostanie usunięta z bazy danych. W przypadku relacji opcjonalnych usuwanie kaskadowe nie jest domyślnie skonfigurowane, ale właściwość klucza obcego zostanie ustawiona na wartość null.

Zobacz Wymagane i Opcjonalne relacje , aby dowiedzieć się, jak można skonfigurować wymaganość relacji.

Zobacz Usuwanie kaskadowe , aby uzyskać więcej informacji na temat sposobu działania usuwania kaskadowego, sposobu ich jawnego konfigurowania i sposobu ich wybierania zgodnie z konwencją.

W poniższym przykładzie kaskadowe usuwanie jest konfigurowane w relacji między Blog i Post, więc post jednostka jest usuwana z bazy danych.

using (var context = new BloggingContext())
{
    var blog = await context.Blogs.Include(b => b.Posts).FirstAsync();
    var post = blog.Posts.First();

    blog.Posts.Remove(post);
    await context.SaveChangesAsync();
}