5 Stimmen

Beim Löschen im EF-Code werden die Navigationseigenschaften zunächst auf null und leer gesetzt

Mir ist etwas Interessantes aufgefallen, als ich zuerst einen Löschvorgang mit EF-Code durchgeführt habe. Ich verwende das folgende Domänenmodell:

public class User
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Playlist> Playlists { get; set; }
}

public class Playlist
{
    public virtual long Id { get; set; }
    public virtual string Title { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<Track> Tracks { get; set; }
}

public class Track
{
    public virtual long Id { get; set; }
    public virtual string Title { get; set; }
    public virtual Playlist Playlist { get; set; }
}

Das Modell wird mit konfiguriert:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().HasMany(x => x.Playlists).WithRequired(x => x.User).Map(x => x.MapKey("UserId"));
    modelBuilder.Entity<Playlist>().HasMany(x => x.Tracks).WithRequired(x => x.Playlist).Map(x => x.MapKey("PlaylistId"));
}

Ich verwende ein allgemeines Repository:

public virtual void Delete(T entity)
{
    Database.Set<T>().Remove(entity);
}

Ich habe auch ein dto, das so aussieht:

public class PlaylistDTO
{
    public PlaylistDTO(Playlist playlist)
    {
        Id = playlist.Id;
        Title = playlist.Title;
        User = playlist.User.Name;
    }
}

In einem meiner Dienste versuche ich, Folgendes zu tun:

public PlaylistDTO Delete(long id)
{
    Playlist playlist = playlistRepository.GetById(id);
    playlistRepository.Delete(playlist);
    unitOfWork.Commit();

    return PlaylistDTO(playlist);
}

Dieser Code schlägt fehl. Als ich durch den Debugger schritt, bemerkte ich etwas Interessantes. In dem Moment, in dem ich playlistRepository.Delete aufrufe, werden die Navigationseigenschaften (User und Tracks) auf null bzw. leer gesetzt. Die Wiedergabeliste bleibt jedoch im Speicher. Wenn ich also die Wiedergabeliste an das DTO übergebe, schlägt der Code fehl, wenn er versucht, auf playlist.User.Name zuzugreifen. Ich wollte diese Daten an den Client weitergeben, um eine Überprüfung anzuzeigen.

Ist dieses Verhalten korrekt? Ist dies beabsichtigt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X