我正在使用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
我看到我试图多次添加每张专辑(因为每张专辑都有很多类型),但我不知道如何解决这个问题。
感谢您的帮助!
答案 0 :(得分:1)
而不是解析为List<File>
只需在该步骤插入数据库。当然,您需要查看该类型是否存在,如果存在,则在该类型下插入文件,如果没有,则插入一个新类型,其中包含List<Album> Albums
由于您可以在一个上下文中完成所有这些操作,因此实体对您来说非常有效。我的意思是,实体将跟踪事物是否在数据库中,您可以构建流派和专辑树,并调用一个保存更改。
答案 1 :(得分: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-coalescing运算符,如果first为null,则选择第二个值。我不确定,但希望这会有所帮助。