你能说出为什么DapperExtension的Update方法无法执行吗?

Mar*_*eIV 2 c# sql sqlite dapper dapper-extensions

我正在使用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)
);
Run Code Online (Sandbox Code Playgroud)

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

Id ="0"
Name ="Test Library"
Description ="这是测试库"
Version ="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; }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何初始化DapperExtensions(我的表是复数除了这个表)...

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

public class LibraryInfoMapper : ClassMapper<LibraryInfo>
{
    public LibraryInfoMapper()
    {
        Table(nameof(LibraryInfo));
        AutoMap();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var libraryInfo = connection.Get<LibraryInfo>(0);
Run Code Online (Sandbox Code Playgroud)

这很好.但是,这失败了......

libraryInfo.Description = "Test";
connection.Update(libraryInfo);
Run Code Online (Sandbox Code Playgroud)

这是例外......

System.Data.SQLite.SQLiteException发生错误码= 1的HResult = -2147467259消息= SQL逻辑错误或丢失的数据库附近 "":语法错误源= System.Data.SQLite堆栈跟踪:在System.Data.SQLite.SQLite3.Prepare( SQLiteConnection cnn,String strSql,SQLiteStatement previous,UInt32 timeoutMS,String&strRemain)InnerException:

不明白为什么!试图找出如何查看它生成的SQL,但我不知道如何做到这一点,即使它是可能的.

救命!!!

G D*_*son 7

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

DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();
Run Code Online (Sandbox Code Playgroud)

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

  • 还有一些让我烦恼的事情-如果您使用扩展方法的更新的异步版本,则需要执行以下操作:DapperAsyncExtensions.SqlDialect = new SqliteDialect();。 (2认同)