entity framework 迁移种子方法复制记录

entity framework migration seed method duplicating records

数据模型:歌曲 - 艺术家 (N:N)

我正在尝试为我的数据库播种,但由于某种原因,在种子方法 运行 之后,我的艺术家变得重复。我不确定为什么...

    CreateSong("COLDPLAY", "Viva la vida", context);
    CreateSong("COLDPLAY", "UP & UP", context);
    CreateSong("COLDPLAY", "UP & UP", context);

CreateSong 方法:

    public Song CreateSong(String artistName, String title, NeosicDbContext context)
    {
        var ret = context.Songs.FirstOrDefault(s => s.Title == title && s.Artists.FirstOrDefault(a => a.Name == artistName) != null);
        if(ret != null)
        {
            return ret;
        }

        **var artists = new List<Artist>();
        var artist = context.Artists.FirstOrDefault(a => a.Name == artistName);
        if (artist == null)
        {
            artist = new Artist { Name = artistName };
            context.Artists.Add(artist);
        }
        artists.Add(artist);**
        var tags = new List<Tag>();
        tags.Add(defaultTag);

        ret = new Song {
            Title = title,
            Artists = artists,
            Tags =  tags
        };
        context.Songs.Add(ret);
        //context.MarkAsModified(ret);
        return ret;
    }

数据库结果: 3 位艺术家,而我只期待一位。

尝试了 context.Artists.Add(artist); 和不使用,但结果保持不变

问题来了:

var artist = context.Artists.FirstOrDefault(a => a.Name == artistName);

此查询系统地访问了数据库。但是,在 SaveChanges 之前,数据库是空的。

所以,你应该这样做:

//check the context (I would like to say the *cache*, but it is a false friend in this case)
var artist = context.Artists.Local.FirstOrDefault(a => a.Name == artistName);
if ( artist == null) {
    //then hit the db
    artist = context.Artists.FirstOrDefault(a => a.Name == artistName);
}