2016-05-27 15 views
-1

エンティティフレームワークのトラッキングを維持しながらナビゲーションコレクションのプロパティを更新するにはどうすればよいですか?asp.net mvcナビゲーションコレクションの更新

ドメイン:

public class BuyLink 
{ 
    public int Id { get; set; } 

    string _buyLinkUrl; 
    public string BuyLinkUrl 
    { 
     get 
     { return _buyLinkUrl; } 
     set 
     { 
      if (!string.IsNullOrWhiteSpace(value)) 
       _buyLinkUrl = value; 
     } 
    } 
} 

DTO:

public class BuyLinkDto 
{ 
    public int Id { get; set; } 

    public string BuyLinkUrl { get; set; } 
} 

コントローラー:

例えば、_songService.GetSong(editSongDto.Song.Id).BuyLinksは、追跡して、現在のbuyLinksは、しかし、どのように私はこのコレクションを更新しない取得んこのトラッキングの変更を失うことなく、editSongDto.BuyLinksからユーザーが編集を提供しましたか?

[HttpPost] 
public ActionResult RequestEdit(EditSongDto editSongDto) 
{ 
    //Doesn't work well because entity Framework doesn't track with this assignment so it adds to the database instead of updating. 
    var buyLinks = _songService.GetSong(editSongDto.Song.Id).BuyLinks = editSongDto.BuyLinkDtos.Select(x => new BuyLink { BuyLinkUrl = x.BuyLinkUrl }).ToList(); 

    _songService.Edit(_songService.GetSong(editSongDto.Song.Id), editSongDto.AudioName, editSongDto.ArtistName, buyLinks); 

     return View("Index"); 
} 

サービス:

public void Edit(Song song, string audioName, string artistName, IEnumerable<BuyLink> buyLinks) 
{ 
    song.AudioName = audioName; 
    song.ArtistName = artistName; 
    song.BuyLinks = buyLinks?.ToList(); 

    _repository.Edit(song); 
} 

レポ:

public virtual void Edit(T entity) 
{ 
    _context.Entry(entity).State = EntityState.Modified; 
    _context.SaveChanges(); 
} 

答えて

1

エンティティを更新するとき、あなたは常にではなく、新しいインスタンスを作成し、しようとするよりも、データベースからの新鮮なインスタンス上で動作するはずです既存のインスタンスを上書きする。つまり、

var song = _songService.GetSong(editSongDto.Song.Id); 
var buyLinks = song.BuyLinks.ToList(); 

... 

foreach (var buyLinkDto in editSongDto.BuyLinkDtos) 
{ 
    var buyLink = buyLinks.SingleOrDefault(m => m.Id != 0 && m.Id == buyLinkDto.Id); 

    // New BuyLink 
    if (buyLink == null) 
    { 
     buyLink = new BuyLink { BuyLinkUrl = buyLinkDto.BuyLinkUrl }; 
     song.BuyLinks.Add(buyLink); 
    } 
    // Existing BuyLink 
    else 
    { 
     buyLink.BuyLinkUrl = buyLinkDto.BuyLinkUrl; 
    } 
} 

ここで、Entity Frameworkは何が起こっているのかを正確に把握し、適切に挿入/更新します。

関連する問題