2009-07-21 6 views
30

Je viens de commencer à utiliser Entity Framework plutôt que mon NHiberante normal pour voir comment fonctionne EF et jusqu'à présent j'ai beaucoup de problèmes, mais un en particulier détache un objet et le maintient les objets enfants associés.
J'ai acheté le livre O'Reilly Entity Framework qui vous dit: "yes framework par défaut ne conserve pas le graphique de l'objet lorsque vous le détachez" mais il ne montre pas comment vous pouvez conserver le graphique! Merci O'Reilly c'est vraiment utile.Entity Framework - Détacher et conserver le graphique de l'objet associé

Quoi qu'il en soit, si quelqu'un peut aider ce serait super, le code ci-dessous:

 using (var creativeWorkshopEntities = new CreativeWorkshopEntities()) 
     { 
      var q = from c in creativeWorkshopEntities.Job.Include("Files") 
        where c.Id == jobId 
        select c; 

      var job = q.First(); 

      creativeWorkshopEntities.Detach(job); 

      return job; 
     } 

Merci!

Dan

Répondre

24

Essayez d'utiliser une requête NoTracking à la place. De cette façon, les objets arenever attaché, de sorte que vous n'avez pas besoin de 'Détacher' qui est lorsque le graphique est déchiqueté:

-à-dire

using (var creativeWorkshopEntities = new CreativeWorkshopEntities())   
{    
    creativeWorkshopEntities.Job.MergeOption = MergeOption.NoTracking; 
    var q = from c in creativeWorkshopEntities.Job.Include("Files") 
      where c.Id == jobId      
      select c;    
    var job = q.First();    
    return job; 
} 

Hope this helps

Alex

(Gestionnaire de programme Entity Framework Team)

+0

C'est grand merci Alex MergeOption fait l'affaire pour, mais le problème est sans détacher mon méthode de mise à jour ne fonctionne pas, de toute façon autour de cela? en utilisant (var creativeWorkshopEntities = new CreativeWorkshopEntities()) { if (job.Id> 0) creativeWorkshopEntities.AttachUpdated (emploi); // Méthode d'extenseur personnalisée else creativeWorkshopEntities.AddToJob (job); creativeWorkshopEntities.SaveChanges(); } –

+0

Vous devez utiliser ApplyPropertyChanges (...) en passant dans l'entité mise à jour. ApplyPropertyChanges (mis à jour) copie les valeurs de l'entité 'updated' sur l'entité d'origine. Pour que cela fonctionne, l'entité 'originale' doit être dans le contexte, soit parce que vous avez conservé une copie et l'avez attachée (recommandé), soit parce que vous avez fait une requête pour la recharger à partir de la base de données. –

+6

Y a-t-il un moyen d'empêcher le graphe d'entité d'être déchiqueté? Pourquoi le détachement est-il mis en œuvre de cette manière? – Den

0

utilisation ci-dessous le code pour garder les objets liés à la mémoire.

+2

Ceci détache seulement un seul objet - pas le graphique entier. –

+0

@DannyVarod Pourquoi penseriez-vous cela? J'ai juste essayé ceci et cela fonctionne comme prévu, toutes les entités sont là. – veljkoz

+0

@veljkoz Le détachement intégré de EF4 a seulement détaché un seul objet, cette implémentation clone l'objet. Je ne me souviens pas pourquoi j'ai écrit ça - c'était il y a plus d'un an et je ne vois pas de modifications. –

3

Dans EF5, MergeOption n'est plus au niveau de DbSet. Ainsi, selon cette: http://msdn.microsoft.com/en-us/data/hh949853.aspx

Si vous voulez faire une requête de suivi ne vous devez faire quelque chose comme:

var q = from c in creativeWorkshopEntities.Job.AsNoTracking().Include("Files") 
         where c.Id == jobId 
         select c;