将嵌套实体添加到数据库

时间:2013-08-20 21:52:36

标签: asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

我正在使用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 

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

感谢您的帮助!

2 个答案:

答案 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,则选择第二个值。我不确定,但希望这会有所帮助。