Zapisywanie powiązanych danych
Oprócz izolowanych jednostek można również korzystać z relacji zdefiniowanych w modelu.
Napiwek
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);
context.SaveChanges();
}
Napiwek
Użyj właściwości EntityEntry.State, aby ustawić stan tylko jednej jednostki. Na przykład context.Entry(blog).State = EntityState.Modified
.
Dodawanie powiązanej jednostki
Jeśli odwołujesz się do nowej jednostki z właściwości nawigacji jednostki, która jest już śledzona przez kontekst, jednostka zostanie odnaleziona i wstawiona 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 = context.Blogs.Include(b => b.Posts).First();
var post = new Post { Title = "Intro to EF Core" };
blog.Posts.Add(post);
context.SaveChanges();
}
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 jest aktualizowana tak, aby należała do nowej jednostki, post
ponieważ jej Blog
właściwość nawigacji jest ustawiona na blog
blog
wartość . Należy również pamiętać, że zostanie wstawiony do bazy danych, blog
ponieważ jest to nowa jednostka, do którego odwołuje się właściwość nawigacji jednostki, która jest już śledzona przez kontekst (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();
}
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 jednostki zależnej, zgodnie z zachowaniem usuwania kaskadowego skonfigurowanego 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 = context.Blogs.Include(b => b.Posts).First();
var post = blog.Posts.First();
blog.Posts.Remove(post);
context.SaveChanges();
}