使用DBML的“自动同步”功能和SQLite

时间:2010-01-05 05:35:02

标签: c# linq-to-sql sqlite

我在尝试使用DBite的“自动同步”功能时遇到了麻烦。我的数据模型中有一个包含主键(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的语句或我遗漏的其他技巧?

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

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

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

3 个答案:

答案 0 :(得分:3)

您正在为项目添加“Linq-to-SQL”数据模型,但是您正在使用它来对抗SQLite - 这当然永远不会有效! Linq-to-SQL only 一直支持SQL Server(总是有,总是会),因此它生成的SQL语句是SQL Server T-SQL语句 - 没有别的。

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

alt text

只有那样才能支持SQLite等第三方数据库驱动程序!

答案 1 :(得分:0)

将LINQ to SQLite的Devart实现不包含此问题。自动增强色谱柱处理正确。

答案 2 :(得分:0)

我遇到了同样的问题并找到了以下解决方法 - 使用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");
    }
};