微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

'外键约束失败'使用此 ApplicationDbContext.cs 配置

如何解决'外键约束失败'使用此 ApplicationDbContext.cs 配置

我在 Mac 上使用 dotnet-sdk 3.1、实体框架和 sqlite。
我似乎无法让我的数据库接受 SearchMetadata 对象或任何使用外键链接到它的类。每当我尝试运行 _db.SaveChanges() 时,我都会收到此错误

enter image description here

我的相关 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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。