Entity Framework
État de l'entité de gestion
Recherche…
Remarques
Les entités dans Entity Framework peuvent avoir différents états répertoriés par l'énumération System.Data.Entity.EntityState . Ces états sont:
Added
Deleted
Detached
Modified
Unchanged
Entity Framework fonctionne avec les POCO. Cela signifie que les entités sont des classes simples qui n'ont pas de propriétés et méthodes pour gérer leur propre état. L'état de l'entité est géré par un contexte lui-même, dans ObjectStateManager
.
Cette rubrique couvre différentes manières de définir l'état d'une entité.
Définition de l'état Ajout d'une entité unique
EntityState.Added
peut être configuré de deux manières totalement équivalentes:
En définissant l'état de son entrée dans le contexte:
context.Entry(entity).State = EntityState.Added;
En l'ajoutant à un
DbSet
du contexte:context.Entities.Add(entity);
Lors de l'appel de SaveChanges
, l'entité sera insérée dans la base de données. Lorsqu'elle a une colonne d'identité (une clé primaire à auto-incrémentation automatique), puis après SaveChanges
, la propriété de clé primaire de l'entité contiendra la nouvelle valeur générée, même si cette propriété avait déjà une valeur .
Définition de l'état Ajout d'un graphique d'objet
Définir l’état d’un graphe d’objets (une collection d’entités liées) à Added
est différent de définir une seule entité comme étant Added
(voir cet exemple ).
Dans l'exemple, nous stockons des planètes et leurs lunes:
Modèle de classe
public class Planet
{
public Planet()
{
Moons = new HashSet<Moon>();
}
public int ID { get; set; }
public string Name { get; set; }
public ICollection<Moon> Moons { get; set; }
}
public class Moon
{
public int ID { get; set; }
public int PlanetID { get; set; }
public string Name { get; set; }
}
Le contexte
public class PlanetDb : DbContext
{
public property DbSet<Planet> Planets { get; set; }
}
Nous utilisons une instance de ce contexte pour ajouter des planètes et leurs lunes:
Exemple
var mars = new Planet { Name = "Mars" };
mars.Moons.Add(new Moon { Name = "Phobos" });
mars.Moons.Add(new Moon { Name = "Deimos" });
context.Planets.Add(mars);
Console.WriteLine(context.Entry(mars).State);
Console.WriteLine(context.Entry(mars.Moons.First()).State);
Sortie:
Added
Added
Ce que nous voyons ici, c'est que l'ajout d'une Planet
définit également l'état d'une lune à Added
.
Lors de la définition de l'état d'une entité à Added
, toutes les entités de ses propriétés de navigation (propriétés qui «naviguent» vers d'autres entités, telles que Planet.Moons
) sont également marquées comme Added
, sauf si elles sont déjà associées au contexte .