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

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

Tip

Ukázku tohoto článku najdete na GitHub.

Přidání grafu nových entit

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

V následujícím příkladu se všechny blogové a tři související příspěvky vloží do databáze. Příspěvky se naštou a přidávají, protože jsou dosažitelné prostřednictvím vlastnosti Blog.Posts navigace.

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

Pomocí vlastnosti EntityEntry.State nastavte stav 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, entita bude zjištěna a vložena do databáze.

V následujícím příkladu se post entita vloží, Postsblog protože se přidá do vlastnosti 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 vlastnost navigace entity, budou provedeny odpovídající změny sloupce cizího klíče v databázi.

V následujícím příkladu se entita post aktualizuje blog tak, aby patřila do nové entity, Blog protože její navigační vlastnost je nastavená tak, aby odkazovat na blog. Všimněte blog si, že se také vloží do databáze, 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 referenční navigace na nullnebo 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í konfiguruje chování kaskádového odstranění a z databáze se odstraní podřízené/závislé entity. Pro volitelné relace 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 je možné nakonfigurovat požadovanost relací, najdete v tématu Povinné a Volitelné relace.

Další podrobnosti o fungování chování kaskádového odstranění, způsobu jejich explicitní konfigurace a způsobu jejich výběru podle konvence najdete v tématu Kaskádové odstranění.

V následujícím příkladu se pro relaci mezi a BlogPostkonfiguruje kaskádové odstranění, post aby se entita odstranila 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();
}