2009-06-13 12 views
1

Ich habe Entitätstyp Auftrag, der einen Verweis auf eine Entität Typ Kunde hat. Es gibt einen Funktionsimport, der basierend auf einem Kriterium eine Liste der Bestellung zurückgibt. Diese Liste von Bestellungen wird in einem Datagrid angezeigt, dasWie man EntityReference manuell lädt ohne EntityReference.Load()

Order.Date | Bestell.Kunden.Name | Order.Total

Damit Customer.Name angezeigt wird, muss ich die CustomerReference in jeder Bestellung in der Liste laden, aber jeder Aufruf von Order.CustomerReference.Load() würde einen Umlauf zum SQL Server machen und die ganzer Prozess sehr ineffizient. Die Frage ist, wenn ich eine einzige Abfrage habe, die alle Kundendaten für alle Bestellungen in der Liste abruft, wie beziehe ich die CustomerReference in jeder Bestellung manuell ein?

Grundsätzlich muss ich .Include ("Customer") mit einer Funktion importieren.

Dank

Antwort

2

Wenn Sie eine Abfrage ausführen, die in einem Rutsch alle zugehörigen Kunden zurückbringt, ist es nicht erforderlich, manuell jede Customerbevölkern zu. Dies liegt daran, dass etwas namens Relationship Fixup dies automatisch für Sie erledigt.

das heißt, wenn Sie dies tun:

Order o = ctx.Orders.First(o => o.Customer.ID == 1); 
// at this point o.Customer == null 

Customer c = ctx.Customers.First(c => c.ID == 1); 
// at this point o.Customer == c 

Beziehung Fixup bedeutet, dass, nachdem der Kunde betritt den Kontext alle zugehörigen Objekt wird nun automatisch darauf zeigen ...

D.h. das ist viel einfacher als du denkst!

this helps

Alex

-1

Dank Alex, ich versuchte. Es funktioniert, wie Sie sagten, aber anscheinend funktioniert es nicht auf abgeleiteten Entitätstyp. Order-Entitätstyp ist eine abstrakte Basisklasse mit einer abgeleiteten Klasse Sale.

Order o1 = ctx.Orders.First(o => o.Customer.ID == 1); 
Sale s1 = ctx.GetSaleByCustomerID_FunctionImport(2).First(); 

Customer c = ctx.Customers.First(c => c.ID == 1); 
Customer c2 = ctx.Customers.First(c => c.ID == 2); 
//At this point o.Customer == c but s1.Customer is still null 

Und ich kann den Import-Rückgabetyp Funktion nicht als Auftrag festlegen, da es abstrakt ist und nicht als Rückgabetyp zulässig ist.

Was fehlt mir hier?

Update: Ich fand heraus, einen Unterschied zwischen o1 es gibt und s1, bevor die Kunden geladen werden o1.CustomerReference.IsLoaded Falsch ist o1.CustomerReference.EntityKey ist ID = 2

s1.CustomerReference.IsLoaded ist Falsch s1.CustomerReference.EntityKey ist null

Aber das Aufrufen von s1.CustomerReference.Load() würde die Kundendaten korrekt laden. Ich habe mein GetSaleByCustomerID Function Import (einfach "SELECT * FROM Kunden WHERE ID = 2") überprüft, es gibt das CustomerID Feld, das von der Referenz benötigt wird.