2016-05-26 13 views
0

Violation of PRIMARY KEY constraint 'PK_dbo.SongCategories'. Cannot insert duplicate key in object 'dbo.SongCategories'. The duplicate key value is (2, 3). The statement has been terminated.アップデートエラー:PRIMARY KEY制約のナビゲーションプロパティ違反

私は、ユーザーが歌ナビゲーションプロパティを編集できるようにしようとしています。

public class Song 
{ 
    //AudioName, Artist etc 
    ... 
    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    ... 
    public virtual ICollection<Song> Songs { get; set; } 
} 

EF列Song_IdCategory_Idと、このからSongCategoriesテーブルを作成します。

コントローラー:

[HttpPost] 
public ActionResult RequestEdit(EditSongDto editSongDto) 
{ 
     var categories = _categoryService.GetCategories().Where(x => editSongDto.SelectedCategoryIds.Any(z => z == x.Id)); 
     _songService.Edit(_songService.GetSong(editSongDto.Song.Id), editSongDto.AudioName, editSongDto.ArtistName, categories); 
} 

サービス:

public void Edit(Song song, string audioName, string artistName, IEnumerable<Category> categories) 
{ 
    song.AudioName = audioName; 
    song.ArtistName = artistName; 

    song.Categories = categories.ToList(); 

    _repository.Edit(song); 
} 

リポジトリ:

と同じものが再びに渡されるときに、この問題が発生
public virtual void Edit(T entity) 
{ 
    _context.Entry(entity).State = EntityState.Modified; 
    Save(); 
} 

。ナビゲーションプロパティを正しく更新するにはどうすればよいですか?私は他のスレッドを見てきましたが、答えはまだ分かりません。

+1

試しましたか? _song.Categories.Clear(); _ _song.Categories = categories.ToList(); _ –

+0

@robinetこれは簡単なことではありません。どうもありがとう。あなたがポイントをしたいなら、私は答えを受け入れるでしょう。私は割り当てがそれを上書きするので、私はクリアする必要はないと推測しました。私はそれがまだプロキシの追跡と関係があると思う。 –

+0

最近私はEFでいくつか頭痛を感じています。とにかく心配しないようにしたいと思うなら、私は答えを加えます、私はあなたのような助けを求めてここに来ました:) –

答えて

1

EFは多対多の関係で扱いにくいです。私はそれがsong.Categories.Clear()を呼び出すことによりsong-Category関係

を既存のを知らないのですあなたはcategories.ToList()で上書きする前に、それは怠惰な負荷song.Categoriesへの変更を持っていないと信じて、あなたが遅延読み込みを強制し、明示的に既存のsong-Category関係がために削除されることを述べますその特定の曲。次のあなたはCategoriesコレクションとEFを上書きして新しい関係を割り当てる正しいINSERT/DELETE

public void Edit(Song song, string audioName, string artistName, IEnumerable<Category> categories) 
{ 
    song.AudioName = audioName; 
    song.ArtistName = artistName; 

    song.Categories.Clear(); 
    song.Categories = categories.ToList(); 

    _repository.Edit(song); 
} 

を生成するために、すべてはたぶんもっと良い方法は、新しいカテゴリリストに含まれていないものを削除song.Categoriesを反復することで、「フィックスアップ」 song.Categoriesにないものをカテゴリリストから追加しますが、自分でテストしていません

関連する問題