Метод начального уровня миграции структуры сущностей, дублирующий записи - PullRequest
0 голосов
/ 22 октября 2018

Модель данных: Song - Artists (N: N)

Я пытаюсь заполнить базу данных, но по какой-то причине мои исполнители получают дубликаты после запуска метода seed.Я не уверен, почему ...

    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 артиста, пока я ожидаю только одного.enter image description here

Пробовал как с context.Artists.Add(artist);, так и без, но результаты остаются прежними

1 Ответ

0 голосов
/ 22 октября 2018

проблема возникает здесь:

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);
}
...