【问题标题】:Using 'Auto-Sync' feature of DBML with SQLite将 DBML 的“自动同步”功能与 SQLite 结合使用
【发布时间】:2019-05-29 21:09:15
【问题描述】:

我在尝试将 DBML 的“自动同步”功能与 SQLite 结合使用时遇到问题。我的数据模型中有一个包含主键 (id) 的类。该键定义为“INTEGER PRIMARY KEY”,SQLite 映射到行的rowid。为了支持这一点,我将“自动生成的值”设置为“True”,将“自动同步”设置为“OnInsert”。

问题是,当我向数据库提交新条目时,SQLite 不支持 LINQ to SQL 类使用的 SELECT 字符串:

SELECT CONVERT(BigInt,SCOPE_IDENTITY()) AS [value]

相反,SQLite 有 last_insert_rowid() 函数,我似乎无法指出。

有谁知道如何解决这个问题?可能是通过更改用于选择最后一行 ID 的语句或我缺少的其他技巧?

编辑提供商的网站上似乎有sometraffic,但没有解决方案。

编辑 因为我似乎对这个问题感到困惑,所以我是这样设置我的应用程序的。希望它有助于阐明我的思考过程,也许是一个潜在的问题。

  • 将新的“LINQ to SQL 类”文件添加到我的解决方案中
  • 在设计器中为我的数据库建模,命名为DataModel
  • 使用System.Data.SQLite.SQLiteConnection 打开数据库
  • 使用此连接初始化DataModel 实例

【问题讨论】:

  • hmm.. DBML = Linq-to-SQL = 仅限 SQL Server。不确定您要在这里做什么 - 但 DBML 文件不是 Linq-to-SQL 的一部分,它仅针对 SQL Server 作为后端?
  • 我应该提到...我使用 System.Data.SQLite (sqlite.phxsoftware.com) 作为后端,它支持 ADO.NET 实体框架。
  • 您能否澄清一下您是根据您的问题和标签使用 LINQ to SQL / DBML(不支持 SQLite),还是使用实体框架 / EDMX(通过您提到的图书馆)根据您的评论?
  • @itowlson:好吧,我想我不太确定。我更新了我的问题以显示我是如何建立连接并使用 DBML 的。希望这会有所帮助。

标签: c# linq-to-sql sqlite


【解决方案1】:

您正在将“Linq-to-SQL”数据模型添加到您的项目中,但您将它用于 SQLite - 当然这永远不会奏效! Linq-to-SQL 曾经支持 SQL Server(一直支持,永远支持),因此它生成的 SQL 语句是 SQL Server T-SQL 语句 - 仅此而已。

如果您想将实体框架与 SQLite 一起使用,您需要使用“ADO.NET 实体数据模型”(扩展名为 .EDMX 的文件)作为数据模型。

仅支持 SQLite 等第三方数据库驱动程序!

【讨论】:

  • 感谢您的回答......真是太可惜了。我没有意识到 LINQ to SQL 与 SQL 服务器的耦合如此紧密。不幸的是,我没有创建 ADO.NET 实体数据模型(DevStudio 标准)的选项。 LINQ to SQL 非常适合简单的查询和插入,但到目前为止似乎仅在这种情况下失败。
【解决方案2】:

LINQ to SQLite 的 Devart 实现不包含此问题。自动增量列被正确处理。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题并找到了以下解决方法 - 使用 SQLiteConnection.Changed 事件拦截查询并修复它:

    SQLiteConnection.Changed += (obj, eventArgs) => {
        var cmd = eventArgs.Command;
        if (eventArgs.EventType == SQLiteConnectionEventType.NewDataReader && cmd != null)
        {
            cmd.CommandText = cmd.CommandText.Replace( @"SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]"
                                                        , @"; SELECT last_insert_rowid() AS value");
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2016-07-18
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      相关资源
      最近更新 更多