2009-05-04 8 views
1

Je ne suis pas en mesure de comprendre cette chose simple dans ASP.NET MVC:Comment passer les résultats de la requête avec les relations FK (EF) à la vue

J'ai deux tables:

Customer: 
    CustomerID 
    FirstName 
    LastName 
    AddressID 
    AddressTemporaryID 

    Address: 
    AddressID 
    Street 
    City 

I Mes relations (FK) sont définies dans DB et essayent d'utiliser Entity Framework. Mes propriétés de navigation (FK) sont nommées Adresses et Adresses1. I créé référentiel:

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

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

Et mon HomeController a ceci:

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

Mais comment puis-je accéder aux valeurs de mon point de vue? Je peux voir item.Adresses.Street/item.Adresses1.Street avec IntelliSense dans le modèle, mais quand je vais essayer, je obtenir 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> 
<% } %> 

Je suis complètement perdu. J'ai essayé de chercher partout mais sans succès.

Répondre

0

EF ne fait pas de chargement paresseux automatique.

Vous devez soit charger manuellement les objets associés (pas possible pour un multiple jeu de résultats comme votre requête), ou demander EF d'inclure les propriétés souhaitées pour une requête entière:

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

Vous pouvez trouver un comparaison de la façon de le faire entre EF et LinqtoSQL (si vous êtes habitué) dans this post. Il vous montrera au moins la syntaxe EF pour cela.

+0

Salut, on dirait que c'est la "magie". J'ai essayé ça et ça a l'air de marcher. Mais j'ai trouvé un autre problème. Lorsque certains clients n'ont pas AddressTemporary (Customer.AddressTemporaryID == Null), j'obtiendrai également cette exception NullReferenceException. – user101096

+0

Cela a du sens. L'algorithme de liaison tente d'accéder à la propriété "Street" sur la propriété "Addresses1", qui renvoie une référence null. Vous devriez essayer d'utiliser quelque chose comme Html.Encode (item.Adresses1 == null? "", Item.Adresses1.Street) dans votre expression –

+0

Wow, ça marche comme un charme maintenant. <% = Html.Encode (item.Addresses! = Null? Item.Addresses.Street: "")%> Comme je me connais, j'atteindrai bientôt un autre "breakpoint", hehe. Merci pour votre aide. – user101096

0

Êtes-vous sûr que

var query = customerRepository.FindAllCustomers(); 

fonctionne correctement? Avez-vous vérifié du côté du contrôleur que la requête est en fait remplie? Vous devez écrire des tests unitaires, mais au minimum, définir un point d'arrêt sur cette ligne, et voir si la requête est remplie correctement.

+0

Bonjour, oui, cela fonctionne correctement. Lorsque je supprime cette ligne Adresses dans ma vue, les données dans Afficher sont affichées correctement. Il est possible que j'ai fait quelque part une faute de frappe en le réécrivant parce que je l'ai écrit dans ma langue maternelle à l'origine. – user101096

0

En fait, dans votre scénario où le AddressId et Address1Id sont FKs dans le tableau:

Alors que les références actuelles (adresse et Adresse1) ne sont pas chargés à moins que vous pouvez soit faire un Include() ou explicite AddressReference.Load().

Le FK valeur réelle est chargé dans l'entité en EntityKey du EntityReference-à-dire

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

Hope this helps Alex

Questions connexes