Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
.
Dodawanie powiązanej jednostki
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();
}