我使用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 错误码= 1 的HResult = -2147467259 Message = SQL逻辑错误或缺少数据库 接近&#34;。&#34;:语法错误 来源= System.Data.SQLite 堆栈跟踪: 在System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn,String strSql,SQLiteStatement previous,UInt32 timeoutMS,String&amp; strRemain) InnerException:
不知道为什么!试图弄清楚如何查看它产生的SQL,但我不知道该怎么做,或者即使它可能。
帮助!!!
答案 0 :(得分:6)
问题是DapperExtensions中SQL生成的默认方言是SqlServer,这意味着内部生成的SQL是使用表别名创建的,Sqlite不支持。在发出任何命令之前,您需要将Dapper Extensions SQL方言更改为Sqlite:
DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();
一旦更改,Dapper Extensions将以Sqlite格式创建SQL命令。