带有拼写修复1扩展的SQLite与第二个查询时实体框架核心崩溃一起使用

2023-12-31

相关剥离项目

https://github.com/djon2003/mediarecognizer-spellfix1 https://github.com/djon2003/mediarecognizer-spellfix1

导入部分已被删除,并且我肯定没有包含 5 GB 的数据库。

Issue

我按照说明编译了pellfix1扩展,它正在工作......好吧,不是第二个查询。

我使用名为“DB Browser for SQLite”的外部软件进行测试,加载我编译的扩展并手动运行查询。没有任何问题。

此链接为您提供了崩溃的确切行。 https://github.com/djon2003/mediarecognizer-spellfix1/blob/069dea3495402a5ab853986fbc05038201c197ce/MediaRecognizer/MediaRecognizer.cs#L96

正如你所看到的...

  • 第一个测试:在没有 SQLite 扩展的情况下检索两个不同的实体 => 它有效。
  • 第二个测试:使用pellfix1检索一个实体与另一个“使用数据库”=>它有效
  • 第三个测试:使用spellfix1在同一“使用数据库”中检索另一个实体=>失败。 (评论)
  • 第四个测试:(不包括)在同一“使用数据库”中使用pellfix1的实体之后检索一个没有spellfix1的实体=>失败。
  • 第五个测试:在另一个“使用数据库”中检索两个不同的实体,而不使用 SQLite 扩展 => 它可以工作。
  • 第六个测试:使用spellfix1在另一个“使用数据库”中检索另一个实体=>失败。

我每次遇到的错误是:Microsoft.Data.Sqlite.SqliteException: 'SQLite Error 1: 'error during initialization: '.'

我找不到任何相关信息。下一步是直接查看扩展代码或 SQLite 代码本身。

EDIT

详细信息:通过返回修改 SQLite 扩展SQLITE_OK_LOAD_PERMANENTLY代替SQLITE_OK扩展初始化修复了该错误。不过,这只是一个补丁。


我不太了解 SQLite 的工作原理以及 EF 应如何与其正确通信,因此我不能说这是一个错误还是预期的行为,但无论如何,下面是发生错误的原因。

您看到该异常是因为 EF Core 尝试加载扩展两次或更多次。根据文档https://www.sqlite.org/loadext.html#implementation_details https://www.sqlite.org/loadext.html#implementation_details(参见 5. 持久可加载扩展):

可加载扩展的默认行为是,当最初调用的数据库连接关闭时,它会从进程内存中卸载。sqlite3_load_extension() closes.

但我们也知道 EF Core 实现了连接池,这意味着使用相同的连接字符串,框架将尝试使用池中的连接,当您完成查询时,它会将连接返回到池中。这意味着它不卸载查询完成时的扩展只是因为连接未关闭。

最重要的是,只有物理连接被池化,但是一个对象SqliteConnection类型是某种逻辑连接,实际上它是物理连接的抽象。

逻辑连接怎么样(SqliteConnection)。实际上是一个新的实例SqliteConnection是用每个创建的DbContext您创建的实例,它完全由 EF Core 管理。 EF Core 似乎在对数据库的每个请求上打开/关闭此逻辑连接(note打开/关闭此连接是非常轻量级的操作,因为它不是物理连接,并且实际的物理连接是从池中获取的)。并且 EF Core 会在每次调用时发送请求来加载请求的扩展Open.

那么让我们回到您的代码示例,看看发生了什么。

相同上下文的多个请求

using (var db = new Context())
{
  var connection = (SqliteConnection)db.Database.GetDbConnection();
  connecton.EnableExtensions(true);
  conn.LoadExtension(@"SQLite Extensions\spellfix1.dll");

  db.Models.FromSqlRaw(SOME QUERY).ToList();
  db.Models.FromSqlRaw(SOMEQUERY).ToList(); // (1) will throw here
}

这会引发 (1),因为您只有一个实例SqliteConnection并两次致电Open方法(每个请求一个)发送加载扩展的请求。因此,第二次调用将尝试第二次加载扩展并抛出异常。

两个请求各有其自己的上下文

using (var db = new Context())
{
  var connection = (SqliteConnection)db.Database.GetDbConnection();
  connecton.EnableExtensions(true);
  conn.LoadExtension(@"SQLite Extensions\spellfix1.dll");

  db.Models.FromSqlRaw(SOME QUERY).ToList();
}

using (var db = new Context())
{
  var connection = (SqliteConnection)db.Database.GetDbConnection();
  connecton.EnableExtensions(true);
  conn.LoadExtension(@"SQLite Extensions\spellfix1.dll");

  db.Models.FromSqlRaw(SOME QUERY).ToList(); // (1) throws here
}

这会抛出(1)因为物理连接用于加载第一个扩展using仍然打开,这意味着在我们再次加载扩展之前尚未卸载它(1).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有拼写修复1扩展的SQLite与第二个查询时实体框架核心崩溃一起使用 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 具有多个原型单元的 TableView

    我有一个关于具有 3 种不同类型的原型单元的表格视图的简单问题 前两个仅出现一次 而第三个则出现 4 次 现在我感到困惑的是如何在 cellforRowatindexpath 中指定哪个单元格原型用于哪一行 所以 我想要类似对于第 0 行
  • dlopen() 是否设置 errno?

    一切都在标题中 手册页没有说明任何内容 一些谷歌报告有些人在 dlopen 之后检查 errno 但只有很少的人并且结果各不相同 该函数确实返回一个成功 不成功值 但是应该如何找出失败的原因 So does dlopen 设置错误号 那么不
  • 如何使用 Netbeans 7.2 和 Maven 设置系统属性?

    我正在 NetBeans 7 2 中运行单元测试 使用 Maven 如何设置系统属性 我尝试使用以下方法添加属性 项目属性 gt 运行 gt JVM 参数 但这没有什么区别 我认为这可能与 JUnit 在不同的 JVM 中运行或其他什么有关
  • 在linux中,如何通过GNU ARM汇编进行系统调用

    到目前为止 我只知道如何通过 gnu arm 汇编退出程序 exit 0 mov r0 0 return code mov r7 1 supervisor service number svc call supervisor service
  • 使用 linq 和 NHibernate 3.0 进行分组

    据我所知 group by 只在 NHibernate 3 0 中添加 但即使使用版本 3 我也无法让 group by 工作 我尝试执行以下查询 Session Query GroupBy gbftr gt gbftr Tag Order
  • gevent (py)wsgi 优雅关闭

    我知道 通过搜索和检查 gevent 的源代码 优雅地关闭基于 gevent WSGI 的服务器的唯一方法是 server gevent wsgi WSGIServer 80 someWSGIApp def shutdown print S
  • JPA为什么使用createNamedQuery

    我正在将 DAO 层从使用 Hibernate API 更改为使用纯 JPA API 实现 看起来推荐的方法是使用实 体管理器中的 createNamedQuery 命名查询存储在模型 实体类的注释中 这对我来说没有意义 为什么要在模型对象
  • 使用 Testcontainers 时如何设置 Postgresql 的端口?

    有时我需要安装一个端口PostgreSQL 我在容器中运行它进行测试 但测试容器开发者命令Testcontainers删除了这个功能 但在某个地方有一个解决方案 通过设置 但我找不到它 谁有关于如何做到这一点的任何想法或信息 public
  • 如何在 MockMvc 中比较两个 jsonPath 值

    我正在使用 MockMvc 为我的 Spring 应用程序编写测试 假设我的 json 结果将具有以下格式 available true location ID 1 path local1 ID 2 path local2 ID 3 pat
  • 在Python中读取SUB之外的行[重复]

    这个问题在这里已经有答案了 新手问题 在 Python 2 7 2 中 我在读取文本文件时遇到问题 这些文件似乎意外包含一些控制字符 具体来说 循环 for line in f 一旦遇到包含以下内容的行就会停止 没有任何警告或错误SUB字符
  • XMLParser 和 SimpleXML 哪个更快

    你们觉得怎么样 我目前在整个项目中使用 SimpleXML 其平均内存使用量为 250KB 每次执行处理时间为 500 微秒 我只是打算切换到 XMLParser 非常感谢您的建议 编辑 实际微时间是 0 000578 微秒 我只是对毫和微
  • ZeroMQ (clrzmq4) 轮询问题

    我想要完成的是实现从两个套接字之一读取消息 无论消息首先到达何处 据我了解轮询 zmq poll 是正确的做法 如指南中的 mspoller http zguide zeromq org cs mspoller 在这里我将提供小的伪代码片段
  • Android datarouter logcat错误消息

    所以我的 logcat 被这个 datarouter 错误发送了垃圾邮件 任何人都可以帮助我解决这个问题并告诉我为什么会发生这种情况 哦 我尝试过重新启动手机和 eclipse 编辑 这似乎主要发生在我的 Mac 工作计算机上 以下是每 3
  • iOS 6 方向问题

    我有一个应用程序 通常是一个纵向应用程序 只显示一个 UIViewController 的横向视图 在新的 iOS 6 发布之前它都可以正常工作 我真的不明白方向在 iOS 6 中是如何工作的 所以我写了一个测试应用程序 这是我所做的 设置
  • 硒测试无法与任何元素相互作用

    所以我知道当我将 Django 设置中的 DEBUG 设置为 False 时 Selenium 无法访问静态文件 导致如下所示 但是 当我运行 Selenium 测试时 无论它们都能够与 DOM 交互并从下拉列表中选择项目 我目前拥有的测试
  • PPL - 如何配置本机线程数?

    我正在尝试使用 PPL 来管理本机线程的数量Scheduler类 这是我的代码 for int i 0 i lt 2000 i configure concurrency count 16 to 32 concurrency Schedul
  • 从 jruby-complete 消耗宝石

    我可以让我的jruby complete消耗传递给它的罐子中的宝石 但我想使用中央宝石库 这就是我现在可以做的 java jar jruby complete 1 6 5 jar S gem list LOCAL GEMS rake 0 8
  • 如何使用 Greasemonkey 代码替换 Head 脚本

    我想将 script js 替换为 demo js 有人请帮助我 尽早运行您的脚本 run at document start 添加事件监听器beforescriptexecute并检查脚本源 当您检测到所需的脚本时 调用preventDe
  • legend.only=T 时的图例属性(栅格包)

    仅绘制图例时 raster对象 颜色条 require raster r raster r 1 plot r legend F plot r zlim c 10 10 legend only T 如何控制图例轴标签大小 刻度长度和其他图例属
  • 带有拼写修复1扩展的SQLite与第二个查询时实体框架核心崩溃一起使用

    相关剥离项目 https github com djon2003 mediarecognizer spellfix1 https github com djon2003 mediarecognizer spellfix1 导入部分已被删除