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

相关文章

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

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque