ASP.NET Core插入数据报SqlException:INSERT与FOREIGN KEY约束冲突如何解决?
问题分析
报错原因
首先可以明确:本次报错和外键与主键字段名相同完全无关,外键和关联主键字段同名是常规的合理设计。
你收到的报错本质是外键约束校验失败:
SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Songs__ArtistID__36B12243". The conflict occurred in database "MusicChannel", table "dbo.Artists", column 'ArtistID'.
The statement has been terminated.
触发原因是往Songs表插入记录时,该记录携带的ArtistID值,在Artists表的ArtistID主键列中不存在,违反了外键的关联一致性要求。
代码问题定位
你的业务逻辑同时新增艺人和歌曲,但写法不符合EF Core的规则,相关代码如下:
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(); } //上下文配置: 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; } }
绝大多数场景下Artists表的ArtistID会设置为自增主键,此时你手动给artist.ArtistID赋值会被数据库忽略,插入艺人记录后会生成新的自增ID。而你给song.ArtistID赋值的是表单传入的固定值,和数据库实际生成的艺人ID不一致,就会触发外键校验失败。
如果ArtistID不是自增主键,你需要额外确认表单传入的ArtistID没有和Artists表已有记录重复,否则艺人插入失败也会导致歌曲的ArtistID找不到对应记录。
修复方案
方案1:同时新增艺人和歌曲
不要手动给歌曲的ArtistID赋值,通过导航属性关联两个对象,EF会自动处理ID的回填关联:
// 去掉 song.ArtistID = formContent.ArtistID; 这行,增加下面的导航关联 song.Artist = artist;
方案2:仅给已有艺人新增歌曲
如果艺人已经存在于库中,不需要新增艺人对象,直接校验ArtistID合法即可:
// 校验传入的ArtistID是否存在 bool isArtistExist = ctx.Artists.Any(a => a.ArtistID == formContent.ArtistID); if (!isArtistExist) { // 处理非法ID逻辑,比如返回报错 } // 去掉Artist对象创建、赋值、Add相关代码即可
数据表结构

内容的提问来源于stack exchange,提问作者mert battal
相关产品推荐
相关产品推荐

