ChristianOConnor
ChristianOConnor

Reputation: 1182

'FOREIGN KEY constraint failed.' with this ApplicationDbContext.cs configuration

I am using dotnet-sdk 3.1, entity framework, and sqlite on a mac.
I can't seem to get my Db to accept the SearchMetadata object or any of the classes that are linked to it with a foreign key. Whenever I try to run _db.SaveChanges() I get this error
enter image description here

My relevant ApplicationDbContext.cs code looks like this:

    public DbSet<SearchMetadata> SearchMetadatas { get; set; }
    public DbSet<SimilarArtist> SimilarArtists { get; set; }
    public DbSet<MoodGrouping> MoodGroupings { get; set; }
    public DbSet<KeyWord> KeyWords { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Track>()
            .HasKey(t => t.Id);

        builder.Entity<SearchMetadata>()
            .HasKey(s => s.Id);
        builder.Entity<SearchMetadata>()
            .HasOne(s => s.Track)
            .WithOne(t => t.SearchMetadata)
            .HasForeignKey<SearchMetadata>(t => t.TrackId);
        builder.Entity<SearchMetadata>()
            .HasOne(s => s.DiscoPlaylist)
            .WithMany(dp => dp.SearchMetadatas)
            .HasForeignKey("DiscoPlaylistId");
        
        builder.Entity<MoodGrouping>()
            .HasKey(mg => mg.Id);
        builder.Entity<MoodGrouping>()
            .HasOne(mg => mg.SearchMetadata)
            .WithMany(s => s.MoodGroupings)
            .HasForeignKey("SearchMetadataId");
        
        builder.Entity<SimilarArtist>()
            .HasKey(sa => sa.Id);
        builder.Entity<SimilarArtist>()
            .HasOne(sa => sa.SearchMetadata)
            .WithMany(s => s.SimilarArtists)
            .HasForeignKey("SearchMetadataId");
        
        builder.Entity<KeyWord>()
            .HasKey(sa => sa.Id);
        builder.Entity<KeyWord>()
            .HasOne(sa => sa.SearchMetadata)
            .WithMany(s => s.KeyWords)
            .HasForeignKey("SearchMetadataId");

        base.OnModelCreating(builder);
    }

The relevant models look like this:

public class Track
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Artist { get; set; }
    public int Duration { get; set; }
    public string DownloadUrl { get; set; }
    public string FormatOfDownload { get; set; }

    public virtual SearchMetadata SearchMetadata { get; set; }
}
public enum Mood
{
    Aggressive,
    Thoughtful,
    Mysterious,
    Playful,
    Driving,
    Powerful,
    Passion,
    Orchestral,
    Celebration,
    Eclectic,
    Fight,
    ElectroPop,
    EDM
}
public enum PublisherType
{
    SelfPublished,
    PublishingCompany
}
public class SearchMetadata
{
    public int Id { get; set; }
    public string Label { get; set; }
    public string Master { get; set; }
    public string Mastercont { get; set; }
    public string Key { get; set; }
    public int? SportsGamesRank { get; set; }
    public int? FilmTVRank { get; set; }
    public int? CommericalRank { get; set; }
    public PublisherType PublisherType { get; set; }
    public string ContactName { get; set; }
    public string ContactEmail { get; set; }

    public int DiscoPlaylistId { get; set; }
    public virtual DiscoPlaylist DiscoPlaylist { get; set; }
    public int TrackId { get; set; }
    public virtual Track Track { get; set; }
    public virtual IEnumerable<MoodGrouping> MoodGroupings { get; set; }
    public virtual IEnumerable<SimilarArtist> SimilarArtists { get; set; }
    public virtual IEnumerable<KeyWord> KeyWords { get; set; }
}
public class MoodGrouping
{
    public int Id { get; set; }
    public int MoodRank { get; set; }
    public Mood Mood { get; set; }
    public int SearchMetadataId { get; set; }
    public virtual SearchMetadata SearchMetadata { get; set; }
}
public class SimilarArtist
{
    public int Id { get; set; }
    public int ArtistRankNum { get; set; }
    public string ArtistName { get; set; }
    public int SearchMetadataId { get; set;}
    public virtual SearchMetadata SearchMetadata { get; set; }
}
public class KeyWord
{
    public int Id { get; set; }
    public int WordRank { get; set; }
    public string WordString { get; set; }
    public int SearchMetadataId { get; set; }
    public virtual SearchMetadata SearchMetadata { get; set; }
}

This is the code that crashes:

foreach (var specTrack in tracksForSearchData)
            {
                var selectTrack = _db.Tracks
                    .FirstOrDefault(t => t.Id == specTrack.Item1);
                var specTrackRealObj = specTrack.Item2;
                PublisherType pubType = new PublisherType();
                if (specTrackRealObj.popt == "self")
                {
                    pubType = PublisherType.SelfPublished;
                }
                else
                {
                    pubType = PublisherType.PublishingCompany;
                }
                var syncsObj = specTrackRealObj.syncs;
                Console.WriteLine(specTrackRealObj.key);
                var pulledSearchMetadataObj = new SearchMetadata
                {
                    Label = specTrackRealObj.label,
                    Master = specTrackRealObj.master,
                    Mastercont = specTrackRealObj.mastercont,
                    Key = specTrackRealObj.key,
                    SportsGamesRank = specTrackRealObj.sgr,
                    FilmTVRank = specTrackRealObj.ftv,
                    CommericalRank = specTrackRealObj.com,
                    PublisherType = pubType,
                    ContactName = syncsObj.Keys.FirstOrDefault(),
                    ContactEmail = syncsObj.Values.FirstOrDefault(),
                    Track = selectTrack,
                    DiscoPlaylist = discoPlaylist
                };
                _db.SearchMetadatas.Add(pulledSearchMetadataObj);
                var specMoodTupleOb = specTrackRealObj.mood;
                foreach (KeyValuePair<int, string> specMood in specMoodTupleOb)
                {
                    MoodGrouping freshMood = new MoodGrouping
                    {
                        MoodRank = specMood.Key,
                        Mood = (Mood)Enum.Parse(typeof(Mood), specMood.Value),
                        SearchMetadata = pulledSearchMetadataObj
                    };
                    _db.MoodGroupings.Add(freshMood);
                }
                var specArtistJsonObj = specTrackRealObj.sims;
                foreach (KeyValuePair<int, string> specArtist in specArtistJsonObj)
                {
                    var pullSimilarArtists = new SimilarArtist
                    {
                        ArtistRankNum = specArtist.Key,
                        ArtistName = specArtist.Value,
                        SearchMetadata = pulledSearchMetadataObj
                    };
                    _db.SimilarArtists.Add(pullSimilarArtists);
                }
                var specKeywordsTupObj = specTrackRealObj.keyws;
                foreach (KeyValuePair<int, string> specKeywords in specKeywordsTupObj)
                {
                    var pullKeyWords = new KeyWord
                    {
                        WordRank = specKeywords.Key,
                        WordString = specKeywords.Value,
                        SearchMetadata = pulledSearchMetadataObj
                    };
                    _db.KeyWords.Add(pullKeyWords);
                }
            }
            _db.SaveChanges();
            return RedirectToAction("Index");

That line that says _db.SaveChanges() is exactly where the code crashes. Can someone show my what the problem is? I know that "tracksForSearchData" is an object that is completely valid for the function and the error is definitely related to what I put in "ApplicationDbContext.cs"

Upvotes: 0

Views: 79

Answers (1)

Serge
Serge

Reputation: 43931

Try to replace:


  Track = selectTrack,

with


  TrackId = selectTrack.Id,

and remove from the code:


   _db.SearchMetadatas.Add(pulledSearchMetadataObj);

Upvotes: 1

Related Questions