我正在试验一个宠物项目Dapper.我使用SQLite运行所有测试和MySql进行“生产”.但是我不确定如何最好地使用Dapper来处理数据库不可知的情况.
我遇到的特殊问题是MySql不支持主键的Guid类型,因此我使用varchar(40)作为类型(SQLite支持唯一标识符,这是一个guid).所以如果我有一个通用的存储库,问题就出现了,我在尝试从MySql数据库中选择时会遇到麻烦.因为Id属性的类型是Guid,Dapper将抛出“Error parsing column 10”,因为varchar类型与guid类型不匹配.
如果我将Id属性从guid更改为int,那么GetById中的原始sql会更加棘手,我不知道如何编写.它将类似于:1.启动事务,2.插入,3.选择最后插入的id并返回它.所以如果数据库类型是mysql,我会使用last_insert_id,或者如果它是sqlite,那么使用last_insert_rowid?因为原始sql语法在数据库与数据库之间会有很大差异……
public IEnumerable GetById(Guid id) //convention: Id is always of type Guid.
{
return UnitOfWork.DbConnection.Query(
string.Format(
"select * from {0} where Id = @Id", typeof (T).Name), new {Id = id});
}
其他示例是限制返回的行数(特别是对于分页)等等.那我怎么用dapper编写数据库无关的原始sql查询?也许在我的情况下Dapper不合适?也许我应该在这里使用相同的旧NHibernate.有什么建议?我做错了吗?谢谢!
解决方法:
尝试使用CHAR(36)作为MySQL中主键的数据类型,这通过MySQl连接器转换为Guid – 我使用的是MySQL连接器版本6.3.4.也适用于Dapper.
标签:c,mysql,sqlite,orm,dapper
来源: https://codeday.me/bug/20190716/1482191.html