3

私はペット プロジェクトで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 を使用する必要があります。助言がありますか?私はそれを間違っていますか?ありがとう!

4

2 に答える 2

1

2 つの質問

  1. 単体テストだけを行っている場合は、そもそもデータベースに接続するべきではありません。

  2. 統合 (およびそれ以外のすべて) を行っている場合は、本番 DB バージョンでテストを実行しないでください。特定の特性によってテストが成功する可能性がありますが、本番コードは失敗する可能性があります。統合テストは、本番環境と同様の構成で実行することになっています。それ以外の場合は関係ありません。

于 2011-09-20T08:32:30.677 に答える