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标签一个接一个...如何做没有列表?谢谢! –