2013-12-17 9 views
20

Próbuję pobrać dane z LocalDb do mojego kontrolera MVC. Próbowałem to:Podana ścieżka włączenia jest nieprawidłowa. EntityType nie deklaruje właściwości nawigacji o nazwie *

UsersContext db = new UsersContext(); 
var users = db.UserProfiles.Where(u => u.UserId == WebSecurity.CurrentUserId) 
          .Include(u => u.LastName).ToList(); 

Zwraca błąd:

A specified Include path is not valid. The EntityType 'ChatProj.Models.UserProfile' does not declare a navigation property with the name 'LastName'.

Here is a picture of my localDb and model.

Każdy pomysł, dlaczego to nie działa?

Odpowiedz

27

Właściwość nawigacyjna powinna być typu podmiotowego kolekcji powiązanych podmiotów. W tym pewna właściwość nawigacji oznacza, że ​​łączysz swoją bieżącą jednostkę z jakimś powiązanym obiektem lub jednostkami. Pozwala to na szybkie ładowanie danych z kilku tabel w jednym zapytaniu. LastName nie jest właściwością nawigacji - to jest proste pole, a zostanie on załadowany domyślnie, nie trzeba umieścić go:

UsersContext db = new UsersContext(); 
var users = db.UserProfiles.Where(u => u.UserId == WebSecurity.CurrentUserId) 
          .ToList(); 

To zapytanie zostanie przetłumaczony na coś takiego

SELECT UserId, UserName, LastName, FirstName 
FROM UserProfiles 
WHERE UserId = @value 
+1

Pozdrawiam m8, wspaniała odpowiedź! – JazzMaster

+2

@JazzMaster welcome :) rozważ także przeczytanie o [Właściwościach nawigacji] (http://msdn.microsoft.com/en-us/data/jj713564.aspx) –

+0

@SergeyBerezovskiy, czy mógłbyś rzucić okiem na moje pytanie? https://stackoverflow.com/questions/28988951/export-to-excel-linq-include-foreignkey-values-in-tolist –

16

Include jest tylko dla właściwości nawigacji, a LastName jest właściwością skalarną, więc w ogóle nie potrzebujesz Include.

+1

Nie mogłem tego lepiej powiedzieć sam. Bardzo zwięzłe. – vapcguy

4

Jeśli chcesz odzyskać tylko LastName użyć

Select(m => m.LastName) 

tak

var users = db.UserProfiles 
       .Where(u => u.UserId == WebSecurity.CurrentUserId) 
       .Select(u => u.LastName)//not Include 
       .ToList(); 

LastName to tylko ciąg (własność skalarne) w modelu, a nie nieruchomość nawigacyjny (relacja z innym podmiot)

7

Mimo że nie jest to całkowicie związane z pytaniem, ponieważ Google cię tu sprowadza, pomyślałem, że warto zauważyć, że przy prawdopodobnej możliwości jest to, że używasz IEnumerable do swojej kolekcji, powinieneś używać ICollection, więcej informacji tutaj: https://stackoverflow.com/a/32997694/550975

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/12649105) – viral

+0

To jest link do innego wpisu SO ... dlatego twój komentarz jest nieodpowiedni tutaj. –

+0

Przyszedłem tutaj z google, to była odpowiedź, której szukałem do tytułu zadawanego pytania. – Dan

Powiązane problemy