J'ai récemment travaillé avec Entity Framework 4 et je ne sais pas trop quand utiliser ObjectSet.Attach et ObjectSet.AddObject .
D'après ma compréhension:
- Utilisez "Joindre" lorsqu'une entité existe déjà dans le système
- Utilisez "AddObject" lors de la création d'une nouvelle entité
Donc, si je crée une nouvelle personne , je le fais.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Si je modifie une personne existante , je fais ceci:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Gardez à l'esprit qu'il s'agit d'un exemple très simple . En réalité, j'utilise Pure POCO (pas de génération de code), le modèle de référentiel (ne traite pas avec ctx.Persons) et Unit of Work (ne traite pas avec ctx.SaveChanges). Mais "sous les couvertures", ce qui précède est ce qui se passe dans ma mise en œuvre.
Maintenant, ma question - je n'ai pas encore trouvé de scénario dans lequel j'ai dû utiliser Attach .
Qu'est-ce que j'oublie ici? Quand devons-nous utiliser Attach?
ÉDITER
Juste pour clarifier, je cherche des exemples d'utilisation de Attach sur AddObject (ou vice-versa).
MODIFIER 2
La réponse ci-dessous est correcte (ce que j'ai accepté), mais j'ai pensé ajouter un autre exemple où Attach serait utile.
Dans mon exemple ci-dessus pour modifier une personne existante , deux requêtes sont en cours d'exécution.
Un pour récupérer la personne (.SingleOrDefault) et un autre pour effectuer la mise à jour (.SaveChanges).
Si (pour une raison quelconque), je savais déjà que "Joe Bloggs" existait dans le système, pourquoi faire une requête supplémentaire pour l'obtenir en premier? Je pourrais faire ceci:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Cela entraînera uniquement l'exécution d'une instruction UPDATE.