Ukládání souvisejících dat

Kromě izolovaných entit můžete také využít relace definované v modelu.

Tip

Ukázku pro tento článek najdete na GitHubu.

Přidání grafu nových entit

Pokud vytvoříte několik nových souvisejících entit, přidání jednoho z nich do kontextu způsobí také přidání ostatních entit.

V následujícím příkladu se do databáze vloží blog a tři související příspěvky. Příspěvky jsou nalezeny a přidány, protože jsou dostupné prostřednictvím Blog.Posts navigační vlastnosti.

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);
    context.SaveChanges();
}

Tip

Vlastnost EntityEntry.State slouží k nastavení stavu pouze jedné entity. Například, context.Entry(blog).State = EntityState.Modified.

Pokud odkazujete na novou entitu z navigační vlastnosti entity, která je již sledována kontextem, bude entita zjištěna a vložena do databáze.

V následujícím příkladu se entita post vloží, protože je přidána do Posts vlastnosti blog entity, která byla načtena z databáze.

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

    blog.Posts.Add(post);
    context.SaveChanges();
}

Změna relací

Pokud změníte navigační vlastnost entity, provede se odpovídající změny ve sloupci cizího klíče v databázi.

V následujícím příkladu je entita aktualizována post tak, aby patřila do nové blog entity, protože její Blog navigační vlastnost je nastavena tak, aby odkazovala na blog. Všimněte si, že se také vloží do databáze, blog protože se jedná o novou entitu, na kterou odkazuje navigační vlastnost entity, která je již sledována kontextem (post).

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

    post.Blog = blog;
    context.SaveChanges();
}

Odebrání relací

Relaci můžete odebrat nastavením navigačního panelu odkazu na nullsouvisející entitu nebo odebráním související entity z navigace v kolekci.

Odebrání relace může mít vedlejší účinky na závislou entitu podle chování kaskádového odstranění nakonfigurovaného v relaci.

Ve výchozím nastavení se u požadovaných relací nakonfiguruje kaskádové odstranění a podřízená/závislá entita se z databáze odstraní. U volitelných relací není kaskádové odstranění ve výchozím nastavení nakonfigurováno, ale vlastnost cizího klíče bude nastavena na hodnotu null.

Informace o tom, jak lze nakonfigurovat požadovanou a volitelnou relaci, najdete v tématu Povinné a Volitelné relace .

Další podrobnosti o tom, jak kaskádové chování odstranění funguje, jak je lze explicitně nakonfigurovat a jak jsou vybrány podle konvence, najdete v tématu Kaskádové odstranění .

V následujícím příkladu je kaskádové odstranění nakonfigurováno pro relaci mezi Blog a Post, takže post entita je odstraněna z databáze.

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

    blog.Posts.Remove(post);
    context.SaveChanges();
}