2015-07-14 15 views
11

Jaka jest różnica między dodawaniem jednostek na te dwa sposoby?Struktura obiektu 6 Utwórz() kontra nowa

MyEntity me = new MyEntity(); 
entities.myentities.Add(me); 

vs

MyEntity me = entities.myentities.Create(); 

Czy nadal muszę dodać "mnie" w drugim przykładzie? Jeśli tak, czy jest jakaś przewaga, w taki czy inny sposób?

Wielkie dzięki!

+0

Miej [patrz w tym] (http: // stackoverflow.com/questions/8204921/createobject-vs-new-object-in-entity-framework) – BBauer42

Odpowiedz

11
MyEntity me = new MyEntity(); 

stworzy nową instancję MyEntity

MyEntity me = entities.myentities.Create(); 

stworzy proxy owinięty instancja MyEntity (zakładając, że kontekst jest skonfigurowany tak, aby utworzyć proxy)

Ten proxy nadpisuje niektóre wirtualne właściwości obiektu do wstawiania przechwytów do wykonywania akcji automatycznie po uzyskaniu dostępu do właściwości. Na przykład ten mechanizm służy do wspierania leniwego ładowania relacji.

from here

+3

Mam nadzieję, że nie stwierdzam tego, co oczywiste, ale miałem trochę więcej czasu na zabawę i odkryłem, że metoda {create} pozwala mi używać właściwości nawigacji (po dodaniu), gdzie jako {nowy} sposób nie działa. – Yabbie

+0

@Yabbie wygenerowany serwer proxy zapewnia te korzyści i jest lepszym sposobem tworzenia nowych instancji. – qujck

3

Tak, nadal musisz go dodać. Od documentation metody Create:

Tworzy nową instancję obiektu dla typu tego zestawu. Zauważ, że to wystąpienie NIE jest dodane lub dołączone do zestawu.

1
MyEntity me = new MyEntity(); 

jest równa

MyEntity me = entities.myentities.Create(); 

Oba powyższe utworzyć nową instancję MyEntity ale ani dołączyć go do DbSet reprezentowanego przez myentities.

Linia

entities.myentities.Add(me) 

przywiązuje wystąpienie do DbSet, choć można użyć Attach(me) również.

"Ja" jest wymagane w drugim przykładzie, ponieważ tworzysz instancję obiektu bez odniesienia do trzymania obiektu.

0

Jeśli używasz jednostki dziedziczenia, można osiągnąć piękny zachowanie polimorfizmu za pomocą metody Create(), ponieważ zawsze wystąpienia prawidłowej jednostki (nie generic jeden). przykład:

public DbSet GetDialDbSet(DialEnum type) 
    { 
     DbSet ret; 
     switch (type) 
     { 
      default: 
      case DialEnum.MAPPING_REASON: 
       ret = DialMappingReasons; 
       break; 

      case DialEnum.PROCESSING_INFORMATION: 
       ret = DialProcessingInformation; 
       break; 
     } 
     return ret; 
    } 

i polimorfizm zastosowanie:

DialDerived entity = (DialDerived) Db.GetDialDbSet(type).Create() 
+0

Nie jest to wcale konieczne. Użyj 'db.Set.BaseClass>(). Utwórz ()'. –

+0

Mój przykład dotyczy warunków środowiska wykonawczego, a nie czasu kompilacji. W takim przypadku twoje rozwiązanie szablonowe jest oczywiście łatwiejsze w użyciu :) – lukyer

+0

Odtworzenie '(DialDerived)' czyni warunek kompilacji. –

Powiązane problemy