SqliteException: SQLite Error 19: ‘FOREIGN KEY constraint failed‘.

2024-02-14 12:04

本文主要是介绍SqliteException: SQLite Error 19: ‘FOREIGN KEY constraint failed‘.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求:

发表动态可以没有标签,允许导航属性为空。

现象:

使用EFCore库框架,添加数据时出现。

截图:

数据表

    public class Moment{public ulong MomentID {  get; set; }public string Content { get; set; } = string.Empty;public ulong LableID {  get; set; }public Lable Lable { get; set; }    }
 public class Lable{public ulong LableID { get; set; }public string Name { get; set; } = string.Empty;public List<Moment> Moments { get; set; }}

DbContext

  public class DataBaseContext : DbContext{public DbSet<Moment> Moments { get; set; }public DbSet<Lable> Lables { get; set; }public string DbPath { get; }public DataBaseContext(){var folder = Environment.CurrentDirectory;DbPath = Path.Join(folder, "DataBase.db");Database.EnsureCreatedAsync();Log.Info("启动EFCore: " + DbPath);}protected override void OnModelCreating(ModelBuilder modelBuilder){             modelBuilder.Entity<Moment>().HasKey(x => x.MomentID);modelBuilder.Entity<Lable>().HasKey(x => x.LableID);modelBuilder.Entity<Moment>().HasOne(x => x.Lable).WithMany(x => x.Moments).HasForeignKey(x => x.LableID);}protected override void OnConfiguring(DbContextOptionsBuilder options){options.UseSqlite($"Data Source={DbPath}");options.LogTo(Log.Debug);}}

Program插入数据代码

namespace EFCore
{using System;using System.ComponentModel;using System.Linq;using System.Linq.Expressions;using System.Reflection;using System.Reflection.Metadata;using System.Text;using Microsoft.EntityFrameworkCore;using Microsoft.EntityFrameworkCore.Migrations;using Microsoft.EntityFrameworkCore.Migrations.Operations;internal class Program{static void Main(string[] args){var folder = Environment.CurrentDirectory;var db = new DataBaseContext();Lable l = db.Lables.Where(x => x.Name == "意难平").ToList().FirstOrDefault(); ;if (l == null){l = new Lable();l.LableID = 1;l.Name = "意难平";db.Lables.Add(l);db.SaveChanges();Console.WriteLine("添加标签完毕");}else{Console.WriteLine("标签存在");}Moment query = db.Moments.Where(x => x.Content == "爱意随风起,风止意难平。").ToList().FirstOrDefault();if (query == null){query = new Moment();query.MomentID = (ulong)DateTime.Now.ToFileTime();query.Content = "爱意随风起,风止意难平。";db.Moments.Add(query);db.SaveChanges();Console.WriteLine("添加动态成功");}else{Console.WriteLine("动态存在");}Console.ReadKey();}}
}

以上代码运行则会报错,

SqliteException: SQLite Error 19: 'FOREIGN KEY constraint failed'.

表预览

改进代码V1

增加IsRequired(false)

则会报错

System.InvalidOperationException:“The property 'Moment.LableID' cannot be marked as nullable/optional because the type of the property is 'ulong' which is not a nullable type. Any property can be marked as non-nullable/required, but only properties of nullable types can be marked as nullable/optional.”

modelBuilder.Entity<Moment>().Property(x=>x.LableID).IsRequired(false);
modelBuilder.Entity<Moment>().Property(x => x.Lable).IsRequired(false);

 改进代码V2

删除上两行配置

modelBuilder.Entity<Moment>().HasOne(x => x.Lable).WithMany(x => x.Moments).HasForeignKey(x => x.LableID).IsRequired(false);

运行依然报错:FOREIGN KEY constraint failed

改进代码V3

保留V2,将Lable加个?,可空标记。

 public class Moment{public ulong MomentID {  get; set; }public string Content { get; set; } = string.Empty;public ulong? LableID {  get; set; }public Lable Lable { get; set; }    }

运行成功

查看数据库字段,已允许为Null了

结语

坑我好几天……不是专业后端……

搜博客翻墙,关键字HasForeignKey,IsRequired 都没找对方法。

谁知道就是缺个?

一键三连

如果可以帮助到你,记得一键三连。

点赞·评论·留言

大家的支持,即是我协作的动力,

或者可以请我喝杯咖啡哦

这篇关于SqliteException: SQLite Error 19: ‘FOREIGN KEY constraint failed‘.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/708454

相关文章

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L