代码之家  ›  专栏  ›  技术社区  ›  jheddings

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

  •  0
  • jheddings  · 技术社区  · 15 年前

    我在尝试将DBML的“自动同步”功能与sqlite结合使用时遇到问题。我的数据模型中有一个包含主键的类( id )此键定义为“整数主键”,SQLite将其映射到 rowid 排成一行。为了支持这一点,我将“auto-generated value”设置为“true”,“auto-sync”设置为“oninsert”。

    问题是,当我向数据库提交一个新条目时, SELECT sqlite不支持linq to sql类使用的字符串:

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

    相反,sqlite有 last_insert_rowid() 功能,我似乎无法指出。

    有人知道怎么补救吗?可能是通过更改用于选择最后一行ID的语句或其他一些我缺少的技巧?

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

    编辑 由于我似乎把这个问题搞混了,下面是我如何设置我的应用程序。希望它能帮助我了解我的思维过程,也许还有一个潜在的问题。

    • 将新的“linq to sql classes”文件添加到我的解决方案中
    • 在设计器中为数据库建模,命名为 DataModel
    • 使用 System.Data.SQLite.SQLiteConnection
    • 初始化 数据模型 使用此连接的实例
    3 回复  |  直到 7 年前
        1
  •  3
  •   marc_s dmck    15 年前

    您正在向项目中添加一个“linq to sql”数据模型,但您正在对sqlite使用它—当然,这是行不通的!LINQtoSQL 只有 任何时候都支持SQL Server(总是有,总是会有),因此它生成的SQL语句是SQL Server T-SQL语句——没有其他。

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

    alt text http://i46.tinypic.com/2cgekr8.png

    只有这样才能支持第三方数据库驱动程序,如sqlite和其他!

        2
  •  0
  •   Devart    15 年前

    linq to sqlite的devart实现不包含此问题。自动增量列处理正确。

        3
  •  0
  •   mpeac    7 年前

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