2009-01-24 2 views

Antwort

9

Verwenden Sie ObjectContext#GetObjectByKey(), um Entitäten mit ihrem Schlüssel abzurufen, anstatt den Operator First() (oder) in der LINQ-Abfrage zu verwenden. Letzterer trifft die Datenbank jedes Mal, während der erstere den EF-Cache (ObjectStateManager, um spezifisch zu sein) zuerst für die Entität durchsucht und nicht auf die Datenbank trifft, wenn die Entität mit dem angegebenen Schlüssel gefunden wird.

Referenzen

4

Angenommen, wir BlogPost Entitätsverweise User Entität über die Author Eigenschaft. Anstatt eine vollständige User Entität für die BlogPost.Author -Eigenschaft anzugeben (die möglicherweise einen Datenbank-Roundtrip erfordert), initialisieren Sie die Referenz mit der richtigen EntityKey. Zum Beispiel:

BlogPost.AuthorReference.EntityKey = new EntityKey("EFNamespace.User", "Id", userId); 
1

Eine schnelle und einfache Möglichkeit, um gelöste Entitätsobjekte zu aktualisieren. Es ist eine Erweiterungsmethode.

public static void AttachUpdated(this ObjectContext obj, EntityObject objectDetached) 
{ 
    if (objectDetached.EntityState == EntityState.Detached) 
    { 
     object original; 
     if (obj.TryGetObjectByKey(objectDetached.EntityKey, out original)) 
      obj.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached); 
     else 
      throw new ObjectNotFoundException(); 
    } 
} 
8

Eine Sache, die ich gerade gelernt haben, wenn die SQLs Profilierung von EF-Code generiert in meiner Anwendung verwendet: Es gibt einen Unterschied zwischen:

IEnumerable<User> users = DB.User.Where(...); 
int count = users.Count(); 

und

IQueryable<User> users = DB.User.Where(...); 
int count = users.Count(); 

der ehemaligen generiert eine vollständige Abfrage, um übereinstimmende Zeilen aus der Tabelle User abzurufen, und die Zählung erfolgt, nachdem die Daten zurück an EF übertragen wurden. Letzteres tut, was allgemein erwartet wird: Erzeugen Sie einen SELECT COUNT ... SQL, der viel effizienter ist.

Dies ist ziemlich subtil, aber nicht schwer zu verstehen, warum, nachdem es bemerkt: es ist aufgrund der statisch gebundenen Natur der C# -Erweiterungsmethode.

Eine kleine Technik, dies zu umgehen ist es, das „var“ Schlüsselwort zu verwenden, um die Variable zu deklarieren:

var users = DB.users.Where(...); 
int count = users.Count(); 

Dies wird „Benutzer“ verursacht als die gleiche Art erklärt wird, dass „.Where“ Erträge ; Das ist ein IQueryable <>.

+0

Dies ist ein gutes Beispiel dafür, warum wir 'var' über den spezifischen Variablentyp empfehlen sollten. – Rafid

Verwandte Themen