SqlException:INSERT 语句与 FOREIGN KEY 约束冲突 - asp.net-core

Posted

技术标签:

【中文标题】SqlException:INSERT 语句与 FOREIGN KEY 约束冲突 - asp.net-core【英文标题】:SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint - asp.net-core 【发布时间】:2022-01-08 00:17:18 【问题描述】:

我正在使用一个名为 MusicChannel 的 SQL 数据库,它将与艺术家一起保存新添加的歌曲。当我尝试添加一些东西时,它给了我一个错误提示:

SqlException:INSERT 语句与 FOREIGN KEY 约束“FK__Songs__ArtistID__36B12243”冲突。冲突发生在数据库“MusicChannel”、表“dbo.Artists”、列“ArtistID”中。 声明已终止。

我按照 Artists、MusicTypes 和 Songs 的顺序创建了表格。歌曲有 2 个 FK 作为 ArtistID 和 MusicTypeID。艺术家的PK是ArtistID。 MusicTypes 的 PK 是 MusicTypeID。这是因为名称相同吗?

这是模型:

public IActionResult Insert(NewSongVm formContent)
        
            if (formContent.MusicTypeID == -1)
            
                //
            
            MusicChannelContext ctx = new MusicChannelContext();
            Song song = new Song();
            Artist artist = new Artist();
            song.SongID = formContent.SongID;
            song.SongName = formContent.SongName;
            song.SongLength = formContent.SongLength;
            song.SongLink = formContent.SongLink;
            song.MusicTypeID = formContent.MusicTypeID;
            song.ArtistID = formContent.ArtistID;
            artist.ArtistID = formContent.ArtistID;
            artist.ArtistName = formContent.ArtistName;
            ctx.Artists.Add(artist);
            ctx.Songs.Add(song);
            ctx.SaveChanges();
            return View();
        
 
//context:

 public class MusicChannelContext:DbContext
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        
            optionsBuilder.UseSqlServer("server=.;database=MusicChannel;trusted_connection=true;");  
        
        public DbSet<Song> Songs  get; set; 
        public DbSet<Artist> Artists  get; set; 
        public DbSet<MusicType> MusicTypes  get; set; 
    

【问题讨论】:

错误不明白怎么办?它告诉你这里的问题。如果您解释什么让您感到困惑,我们可以尝试详细说明让您感到困惑的领域。 这能回答你的问题吗? INSERT statement conflicted with the FOREIGN KEY constraint - SQL Server 请查看thread。这可能会解决您的问题。 【参考方案1】:

您需要在Artist表中保存更改,Add命令不会在数据库中创建记录,

另一种解决方案是从数据库中的表中删除 FK 约束,然后您可以按照您想要的任何顺序创建记录。

检查流动样本:

         MusicChannelContext ctx = new MusicChannelContext();
        Artist artist = new Artist();
        artist.ArtistID = formContent.ArtistID;
        artist.ArtistName = formContent.ArtistName;
        ctx.Artists.Add(artist);
        ctx.SaveChanges();

        Song song = new Song();
        song.SongID = formContent.SongID;
        song.SongName = formContent.SongName;
        song.SongLength = formContent.SongLength;
        song.SongLink = formContent.SongLink;
        song.MusicTypeID = formContent.MusicTypeID;
        song.ArtistID = formContent.ArtistID;

        ctx.Songs.Add(song);
        ctx.SaveChanges();

【讨论】:

谢谢。这解决了它。

以上是关于SqlException:INSERT 语句与 FOREIGN KEY 约束冲突 - asp.net-core的主要内容,如果未能解决你的问题,请参考以下文章

mybatis之insert语句报错Cause: java.sql.SQLException: sql injection violation, syntax error: ERROR. token

SQLException : 字符串或二进制数据将被截断

JDBC Insert语句插入Oracle数据库返回数据主键

java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01003: 语句未进行语法分析

SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“任务”中插入标识列的显式值

Spring Batch 无法获取 last_insert_id();嵌套异常是 java.sql.SQLException: Lock wait timeout exceeded;