问题描述
我在 Mac 上使用 dotnet-sdk 3.1、实体框架和 sqlite。
我似乎无法让我的数据库接受 SearchMetadata 对象或任何使用外键链接到它的类。每当我尝试运行 _db.SaveChanges() 时,我都会收到此错误
我的相关 ApplicationDbContext.cs 代码如下所示:
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);
}
相关模型如下所示:
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; }
}
这是崩溃的代码:
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");
_db.SaveChanges() 行正是代码崩溃的地方。有人可以告诉我问题是什么吗?我知道“tracksForSearchData”是一个对函数完全有效的对象,错误肯定与我放在“ApplicationDbContext.cs”中的内容有关
解决方法
尝试替换:
Track = selectTrack,
与
TrackId = selectTrack.Id,
并从代码中删除:
_db.SearchMetadatas.Add(pulledSearchMetadataObj);