私はペット プロジェクトでDapperを実験しています。SQLiteを使用してすべてのテストを実行し、MySql を「本番」用に使用しています。ただし、データベースに依存しない状況を処理するために Dapper を最適に使用する方法がわかりません。
私が抱えている特定の問題は、主キーのGuid タイプをサポートしていないMySql にあるため、タイプとしてvarchar(40)を使用しています (SQLite は GUID である一意の識別子をサポートしています)。したがって、以下のような一般的なリポジトリがある場合、MySql データベースから選択しようとすると問題が発生します。Id プロパティの型は Guid であり、varchar 型が guid 型と一致しないため、Dapper は「 Error parsing column 10 」をスローします。
Id プロパティを guid から int に変更すると、GetById 内の生の SQL はさらにトリッキーになり、どのように記述すればよいかわかりません。1.トランザクションの開始、2.挿入、3.最後に挿入されたIDを選択して返す、のようなものになります。データベースの種類が mysql の場合はlast_insert_idを使用しますか、それとも sqlite の場合はlast_insert_rowidを使用しますか? 生のSQL構文はデータベースごとにかなり異なるため...
public IEnumerable<T> GetById(Guid id) //convention: Id is always of type Guid.
{
return UnitOfWork.DbConnection.Query<T>(
string.Format(
"select * from {0} where Id = @Id", typeof (T).Name), new {Id = id});
}
他の例として、返される行数を制限する (特にページングの場合) などがあります。では、データベースにとらわれない未加工の SQL クエリを dapper で作成するにはどうすればよいでしょうか。おそらく私の状況ではDapperは適していませんか?おそらく、ここでは同じ古い NHibernate を使用する必要があります。助言がありますか?私はそれを間違っていますか?ありがとう!