Я заметил кое-что интересное, когда выполнял удаление сначала с использованием кода EF.Я использую следующую модель домена:
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; }
}
Модель настроена с использованием:
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"));
}
Я использую общий репозиторий:
public virtual void Delete(T entity)
{
Database.Set<T>().Remove(entity);
}
У меня также естьЭто выглядит следующим образом:
public class PlaylistDTO
{
public PlaylistDTO(Playlist playlist)
{
Id = playlist.Id;
Title = playlist.Title;
User = playlist.User.Name;
}
}
В одном из моих сервисов я пытаюсь сделать следующее:
public PlaylistDTO Delete(long id)
{
Playlist playlist = playlistRepository.GetById(id);
playlistRepository.Delete(playlist);
unitOfWork.Commit();
return PlaylistDTO(playlist);
}
Этот код не выполняется.Когда я прошел через отладчик, я заметил кое-что интересное.В тот момент, когда я вызываю playlistRepository. Удалите навигационные свойства (User и Tracks), которые будут установлены в null и empty соответственно.Однако плейлист остается в памяти.Поэтому, когда я передаю плейлист DTO, код не работает, когда он пытается получить доступ к playlist.User.Name.Я хотел передать эти данные клиенту для отображения подтверждения.
Правильно ли это поведение?Это по замыслу?