2017-10-20 3 views
0

Meine Klassen sind so entworfen:Holen Eigentum Eigentum

public class Video { 
    public int Id {get; set;} 
    public string Title {get; set;} 

    public int PlaylistId {get; set;} 
    [ForeignKey("PlaylistId")] 
    public Playlist Playlist {get; set;} 
} 

public class Playlist { 
    public int Id {get; set;} 
    public string Description {get; set;} 

    public List<Video> Videos {get; set;} 

    public Playlist() { 
     Videos = new List<Video>(); 
    } 
} 

Und nun können einige Objekte erstellen:

Video video = new Video(); 
video.Title = "Titanic"; 

Playlist playlist = new Playlist(); 
playlist.Description = "Best videos"; 
playlist.Videos.Add(video); 

context.Playlists.Add(playlist); 
context.SaveChanges(); 

Das Problem ist, ich video.Playlist Bezug aus meiner Datenbank Kontext erhalten kann nicht. Natürlich könnte ich eine Methode hinzufügen, um die gewünschte Eigenschaft zu erhalten:

public static Playlist GetPlaylist(int videoId) { 
    using (var context = new DatabaseContext()) { 
     Video video = context.Videos.FirstOrDefault(x => x.Id == videoId); 
     return context.Playlists.FirstOrDefault(x => x.Id == video.PlaylistId); 
    } 
} 

Aber ich denke, es muss eine bessere Lösung geben. Kannst du mir damit helfen?

Antwort

1

Versuchen Sie, Ihre Klassendeklarationen zu korrigieren (virtual und ICollection). Achten Sie auch darauf, dass context.Configuration.LazyLoadingEnabled = true;:

public class Video 
{ 
    public int Id {get; set;} 
    public string Title {get; set;} 

    public int PlaylistId {get; set;} 
    [ForeignKey("PlaylistId")] 
    public virtual Playlist Playlist {get; set;} 
} 

public class Playlist 
{ 
    public int Id {get; set;} 
    public string Description {get; set;} 

    public virtual ICollection<Video> Videos {get; set;} 
} 
0

Wenn Sie bestimmte Dinge auswählen möchten, können Sie sie einfach auswählen:

var playlist = context.Videos 
        .Where(x => x.Id == videoId) 
        .Select(x => x.Playlist) 
        .FirstOrDefault(); 

Sie können auch Include verwenden, um referenzierten Entitäten angeben zu ladende

var video = context.Videos 
        .Include(x => x.Playlist) 
        .FirstOrDefault(x => x.Id == videoId); 
var playlist = video.Playlist; 

Die dritte Option wäre virtual und Lazy-Loading als @SlavaUtesinov beantwortet. Aber wenn Sie im Voraus wissen, dass Sie die Wiedergabeliste wollen, brauchen Sie kein lazy loading, es würde nur unnötige Zwischenabfragen erzeugen.

Lazy Loading wäre ein guter Weg, wenn Sie eine Liste von Videos laden möchten und Sie nur auf die Wiedergabelisten für einige der Videos zugreifen möchten, nicht die meisten/alle von ihnen.