0

我正在使用 MVC 4 和 Entity Framework 5 Code First。

我有以下实体:

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 

我看到我试图多次添加每张专辑(因为每张专辑都有很多流派),但我不知道如何解决这个问题。

感谢帮助!

4

2 回答 2

1

而不是在该步骤中仅将其解析为List<File>插入数据库。当然,您需要查看该流派是否存在,如果存在则插入该流派下的文件,如果不存在则插入一个新流派,该文件已在List<Album> Albums

由于您可以在一个上下文中完成所有这些操作,因此实体对您来说将非常有效。我的意思是实体将跟踪数据库中是否存在事物,您可以构建流派和专辑树并调用一个保存更改。

于 2013-08-20T22:21:45.587 回答
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();

这 ??是空合并运算符,如果第一个值为空,它会选择第二个值。我不确定,但希望这会有所帮助。

于 2013-08-20T22:30:02.057 回答