2009-07-21 10 views
30

Właśnie zacząłem używać Entity Framework zamiast normalnego NHiberante, aby zobaczyć, jak działa EF i jak dotąd mam wiele problemów, ale jeden w szczególności oddziela obiekt i utrzymuje powiązane obiekty podrzędne.
Kupiłem książkę O'Reilly Entity Framework, która mówi, że "tak struktura obiektu domyślnie nie zachowuje wykresu obiektu po oderwaniu", ale nie pokazuje, jak zachować wykres! Dzięki O'Reilly to naprawdę przydatne.Entity Framework - Odłącz i zatrzymaj obiektowy wykres

W każdym razie, jeśli ktoś może pomóc, że byłoby świetnie, kod poniżej:

 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; 
     } 

Dzięki!

Dan

Odpowiedz

24

Spróbuj użyć kwerendy NoTracking zamiast. W ten sposób obiekty arenever przywiązany, więc nie trzeba do 'detach', która jest wtedy, gdy wykres jest rozdrobniony:

tj

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; 
} 

Nadzieja to pomaga

Alex

(Menedżer programu Zespół Entity Framework)

+0

to świetnie dzięki Alex MergeOption zrobić lewę dla ale problem jest bez odłączyć mój metoda aktualizacji nie działa, w każdym razie dookoła tego? przy użyciu (var creativeWorkshopEntities = new CreativeWorkshopEntities()) { if (job.Id> 0) creativeWorkshopEntities.AttachUpdated (zadanie); // niestandardowa metoda ekstensora else creativeWorkshopEntities.AddToJob (zadanie); creativeWorkshopEntities.SaveChanges(); } –

+0

Musisz użyć ApplyPropertyChanges (...) przekazując zaktualizowaną encję. ApplyPropertyChanges (updated) kopiuje wartości z "zaktualizowanego" obiektu do oryginalnego obiektu. Aby to działało, oryginalna encja musi znajdować się w kontekście, albo dlatego, że zatrzymałeś kopię i ją załączyłeś (zalecane), albo dlatego, że wykonałeś zapytanie, aby ponownie załadować ją z bazy danych. –

+6

Czy istnieje sposób, aby zapobiec rozdrobnieniu wykresu encji? Dlaczego odłączyć wdrażanie w ten sposób? – Den

0

skorzystać z poniższego kodu, aby zachować podobnych obiektów w pamięci.

+2

Powoduje to odłączenie tylko jednego obiektu - nie całego wykresu. –

+0

@DannyVarod Dlaczego tak uważasz? Właśnie próbowałem tego i działa zgodnie z oczekiwaniami, wszystkie te elementy istnieją. – veljkoz

+0

@veljkoz Wbudowany detach z EF4 odłączył tylko jeden obiekt, ta implementacja klonuje obiekt. Nie pamiętam, dlaczego to napisałem - minęło ponad rok i nie widzę żadnych zmian. –

3

W wersji EF5 MergeOption nie jest już na poziomie DbSet. Tak więc zgodnie z tym: http://msdn.microsoft.com/en-us/data/hh949853.aspx

Jeśli chcesz zrobić nie śledzi zapytanie trzeba będzie zrobić coś takiego:

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