0

我使用MVC 4和實體框架5代碼優先。添加嵌套實體到數據庫

我有以下實體:

public class File 
{ 
    public string Album { get; set; } 

    public string Genre { get; set; } 
} 

public class Genre 
{ 
    public string GenreId { get; set; } 

    public virtual List<Album> Albums { get; set; } 
} 

public class Album 
{ 
    public string AlbumId { get; set; } 
} 

我嘗試將它們添加到數據庫:

 private readonly List<File> _files = new List<File>(); 

     var genres = _files 
      .Select(x => new Genre { GenreId = x.Genre }) 
      .GroupBy(x => x.GenreId) 
      .Select(x => x.First()) 
      .ToList(); 

     foreach (var genre in genres) 
     { 
      var genreId = genre.GenreId; 

      var albums = _files 
       .Where(x => x.Genre == genreId) 
       .Select(x => new Album { AlbumId = x.Album }) 
       .GroupBy(x => x.AlbumId) 
       .Select(x => x.First()) 
       .ToList(); 

      genre.Albums = albums; 

      _unitOfWork.GenreRepository.Insert(genre); 
     } 

而且我得到以下錯誤:

Violation of PRIMARY KEY constraint 'PK_dbo.Albums'. Cannot insert duplicate key in object 'dbo.Albums'. The duplicate key value is (Ooz). 

的語句被終止。

我嘗試添加看起來像數據如下:

--Tribal 
----Ooz 
--Goa Trance 
----Ooz 
----Transient Dawn 
--Progressive Trance 
----Ooz 
----Music Prostitute: The Remixes 
--Psy-Trance 
----Music Prostitute: The Remixes 
--Downtempo 
----Transient Dawn 
--Ambient 
----Transient Dawn 

我看到,我想添加的每個專輯多次(因爲每張專輯有很多流派),但我不知道如何解決這個問題。

感謝您的幫助!

+0

什麼是_files? –

+0

_files是列表。我索引我的mp3文件標籤,然後解析成流派,專輯等。我把它添加到我的問題。 –

回答

1

創建相冊列表時,請在創建相冊之前嘗試從數據庫中獲取相冊。

試試這個:

var albums = _files 
      .Where(x => x.Genre == genreId) 
      .Select(x => _yourDBContext.Albums.Where(album=>album.AlbumId == x.Album).FirstOrDefault() ?? 
         new Album { AlbumId = x.Album }) 
      .GroupBy(x => x.AlbumId) 
      .Select(x => x.First()) 
      .ToList(); 

的?是空合併運算符,如果第一個值爲null,則選擇第二個值。我不確定,但希望這會有所幫助。

+0

這有幫助!非常感謝! –

1

而不是解析成List<File>只需在該步驟插入數據庫。當然,您需要查看該類型是否存在,如果它確實插入了該類型的文件,如果不存在,則插入一個新類型的文件已經在List<Album> Albums

因爲您可以做所有在一種情況下,實體將對你非常有效。我的意思是,實體會跟蹤事物是否在數據庫中,您可以創建流派和專輯樹並調用一次保存更改。

+0

但如何檢查相冊是否存在?請給我一個簡單的例子。 –

+0

您可以簡單地使用_yourDBContext.Albums.Where(album => album.AlbumId == "someId");,正如您在我的答案中所看到的那樣。告訴我,如果它可以幫助你。 – Mzn

+0

Mzn給了我一個幫助的例子,但我在想你的建議......我的模型非常複雜,只有5個實體之間有許多多對多的導航屬性。我索引MP3標籤一個接一個...如何做沒有列表?謝謝! –

相關問題