Reputation: 1182
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
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
Reputation: 43931
Try to replace:
Track = selectTrack,
with
TrackId = selectTrack.Id,
and remove from the code:
_db.SearchMetadatas.Add(pulledSearchMetadataObj);
Upvotes: 1