2

我正在使用 SQLite、Dapper 和 DapperExtensions,所有这些都是通过 NuGet 提供的最新版本。

这是我的表的架构...

CREATE TABLE `LibraryInfo` (
    `Id`    INTEGER NOT NULL,
    `Name`  TEXT NOT NULL CHECK(length ( Name ) > 0),
    `Description`   TEXT,
    `Version`   TEXT NOT NULL CHECK(length ( Version ) > 0),
    PRIMARY KEY(Id)
);

在其中我有一行包含以下数据

Id =“0”
名称=“测试库”
描述=“这是测试库”
版本=“1.2.3.4”

这是我那张桌子的 POCO ......

public class LibraryInfo
{
    public int    Id          { get; set; }
    public string Name        { get; set; }
    public string Description { get; set; }
    public string Version     { get; set; }
}

这是我初始化 DapperExtensions 的方式(我的表是复数,除了这个表)......

DapperExtensions.DapperExtensions.DefaultMapper = typeof(PluralizedAutoClassMapper<>);

public class LibraryInfoMapper : ClassMapper<LibraryInfo>
{
    public LibraryInfoMapper()
    {
        Table(nameof(LibraryInfo));
        AutoMap();
    }
}

这是让我从数据库中读取 ID 为 0 的单行的代码......

var libraryInfo = connection.Get<LibraryInfo>(0);

这很好用。然而,这失败了……

libraryInfo.Description = "Test";
connection.Update(libraryInfo);

这是例外...

System.Data.SQLite.SQLiteException 发生 ErrorCode=1 HResult=-2147467259 消息=SQL 逻辑错误或“.”附近缺少数据库:语法错误 Source=System.Data.SQLite StackTrace:在 System.Data.SQLite.SQLite3.Prepare( SQLiteConnection cnn, String strSql, SQLiteStatement previous, UInt32 timeoutMS, String& strRemain) InnerException:

不知道为什么!试图弄清楚如何查看它正在生成什么 SQL,但我不知道如何做到这一点,或者即使它是可能的。

帮助!!!

4

1 回答 1

9

问题是 DapperExtensions 中 SQL 生成的默认方言是 SqlServer,这意味着内部生成的 SQL 是使用 Sqlite 不支持的表别名创建的。在发出任何命令之前,您需要将 Dapper Extensions SQL 方言更改为 Sqlite:

DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();

一旦更改,Dapper Extensions 将以 Sqlite 格式创建 SQL 命令。

于 2016-07-09T16:59:14.510 回答