2009-05-04 3 views
1

Ich bin nicht in der Lage, um herauszufinden, diese einfache Sache in ASP.NET MVC zu übergeben:Wie Abfrageergebnisse mit FK Beziehungen (EF) auf die Ansicht

Ich habe zwei Tabellen:

Customer: 
    CustomerID 
    FirstName 
    LastName 
    AddressID 
    AddressTemporaryID 

    Address: 
    AddressID 
    Street 
    City 

I habe meine Relationen (FK) in DB gesetzt und versuche Entity Framework zu benutzen. Meine Navigationseigenschaften (FK) heißen Adressen und Adressen1. I erstellt Repository:

public interface ICustomertRepository { 
    IQueryable<Customer> FindAllCustomers(); 
    } 

    public class CustomerRepository : MvcApplication2.Models.ICustomerRepository { 
    public IQueryable<Customer> FindAllCustomers() { 
     return db.Customers; 
    } 
    } 

Und mein Homecontroller hat dies:

public ActionResult Index() 
    { 
    var query = customerRepository.FindAllCustomers(); 
    return View(query); 
    } 

Aber wie kann ich auf Werte in meiner Ansicht? Ich kann item.Adresses.Street/item.Adresses1.Street mit Intellisense in Modell sehen, aber wenn ich es versuchen wird, ich Nullreferenceexception:

<% foreach (var item in Model) 
    { %> 
<tr> 
    <td> 
     <%= Html.Encode(item.FirstName) %> 
    </td> 
    <td> 
     <%= Html.Encode(item.Surname) %> 
    </td> 
    <td> 
     <%= Html.Encode(item.Adresses.Street) %> 
    </td> 
    <td> 
     <%= Html.Encode(item.Adresses1.Street) %> 
    </td> 
</tr> 
<% } %> 

ich völlig verloren bin. Ich habe versucht, überall zu suchen, aber ohne Erfolg.

Antwort

0

EF führt kein automatisches Lazy Loading durch.

Sie müssen entweder manuell die entsprechenden Objekte laden (nicht machbar für ein Mehrfach Ergebnis wie Ihre Abfrage gesetzt) ​​oder EF anweisen, die gewünschten Eigenschaften für eine ganze Abfrage enthält:

public IQueryable<Customer> FindAllCustomers() { 
    return db.Customers.Include("Adresses").Include("Adresses1"); 
    } 

Sie können einen finden Vergleich der Vorgehensweise zwischen EF und LinqtoSQL (wenn Sie es gewohnt sind) in this post. Es wird Ihnen zumindest die EF-Syntax dafür zeigen.

+0

Hallo, sieht so aus als wäre das "Magie". Ich habe das versucht und es scheint zu funktionieren. Aber ich habe ein anderes Problem gefunden. Wenn ein Kunde kein AddressTemporary (Customer.AddressTemporaryID == Null) hat, erhalte ich auch diese NullReferenceException. – user101096

+0

Das macht Sinn. Der Bindungsalgorithmus versucht, auf die Eigenschaft "Street" in der Eigenschaft "Addresses1" zuzugreifen, die eine Nullreferenz zurückgibt. Sie sollten versuchen, etwas wie Html.Encode (item.Adresses1 == null? "", Item.Adresses1.Street) in deinem Ausdruck –

+0

Wow, es funktioniert jetzt wie ein Zauber. <% = Html.Encode (item.Addresses! = Null? Item.Addresses.Street: "")%> Wie ich mich selbst kenne, werde ich bald einen anderen "Breakpoint" erreichen, hehe. Danke für Ihre Hilfe. – user101096

0

Sind Sie sicher, dass

var query = customerRepository.FindAllCustomers(); 

richtig funktioniert? Haben Sie auf der Controllerseite überprüft, dass die Abfrage tatsächlich ausgefüllt ist? Sie sollten einige Komponententests schreiben, aber mindestens einen Haltepunkt für diese Zeile festlegen und prüfen, ob die Abfrage korrekt ausgefüllt wird.

+0

Hallo, ja es funktioniert richtig. Wenn ich diese Adresszeile in meiner Ansicht entferne, werden Daten in View korrekt angezeigt. Es ist möglich, dass ich irgendwo einen Tippfehler gemacht habe, während ich es neu geschrieben habe, weil ich es ursprünglich in meiner Muttersprache geschrieben habe. – user101096

0

Eigentlich in Ihrem Szenario, in dem die AddressId und Address1Id sind FKs in der Tabelle:

Während die Hinweise (Adresse und Address1) werden nicht geladen, wenn Sie ein Include() oder eine explizite AddressReference.Load().

Die beiden tun ist FK Wert geladen wird in das Entity in die EntityReference des EntityKey dh

addressID = item.AddressReference.EntityKey.EntityKeyValues[0].Value; 

hoffe, das hilft Alex

Verwandte Themen