Entity Framework、Dapper、SSDTの組み合わせですか?

c# dapper entity-framework sql-server-data-tools

質問

私は新しい開発プロジェクトを立ち上げる初期段階にあり、私は自分のデータベースアクセス戦略をどのようにセットアップするのか不明です。私はVisual Studio 2012を使用しており、.NET 4.5とSQL Server 2008または2012を対象とします。

私が確信していることは、Entity Frameworkを使用するかどうか、もしそうなら、どの程度まで使用するかということです。データベースからデータを読み取り、それを処理することがこのアプリケーションの主な仕事になると、クエリのパフォーマンスが重要になります。私は、EF5がその点でEF4.xよりもずっと優れていることを知っていますが、それは私が最も心配している固有のEFオーバーヘッドではありません(Dapperのようなものはまだ少なくとも2倍速いですが)なぜなら、あまりにも多くのクエリを実行するのは、LINQを使用すると非常に簡単だからです。ですから、純粋なSQLクエリをデータを取得する主な方法にしたいと思います。

しかし、EFについて私が最も間違っているのは、

  1. コンパイル時間クエリのチェック。
  2. 変更追跡。
  3. コードの最初の開発。
  4. 作業パターンの単位。

私は変更の追跡なしで暮らすことができますが、新しいものや更新されたものを特定することは通常困難ではありません。

私が望むのは、このプロジェクトの開発者はテーブルデザイナーを悩ます必要はなく、単にPOCOを書くことができるということです。ですから、私はEFのコードの最初のアプローチに本当に感謝しています。これにより、開発者はソースコードをクローンし、 update-databaseを呼び出し、動作するローカルデータベースを持つことができます。これは過去に私にとってうまくいったものです。

私にとって非常に重要なもう一つのことは、作業パターンの単位、または挿入と更新のアトミック性です。すべての変更をキューに入れ、 SaveChangesを呼び出す単一のポイントが必要です。 DapperExtensionsようなライブラリでは、 Insertメソッドを取得しますが、すぐにデータベース呼び出しを行います。トランザクションをラップしてアトミックにすることはできますが、それはキューに入れることと同じではありません。だから、私はこれのために何らかの並べ替えのメカニズムを自分でロールバックしなければならないだろう。

コンパイル時のクエリのチェックでは、SQL Server Data Tools(SSDT)の使用を検討します。クエリはストアドプロシージャ(C#コードで大規模なクエリ文字列ブロブを避けるため)とSSDTを使用して、ビルド時にチェックすることができます。 SSDTのもう1つの利点は、Visual Studioからターゲットデータベースにストアドプロシージャを展開できることです。そして、最も重要なのは、これらのためのSQLスクリプトはソース管理に存在するということです。

それで、私のソリューションは基本的に3つのデータアクセス技術から成り立っています:

エンティティフレームワーク

  • POCOデータモデルからデータベースを作成する責任があります。
  • 作業パターンの単位を通してデータを挿入/更新するために使用されます。 1つ目の注意点は、SQLを介してフェッチしたエンティティをコンテキストにAttachする必要があることです。

SSDT

  • コンパイル時にSQLスクリプトを検証するために使用されます。
  • スクリプトをGitに置くことができます。
  • EFがデータベースに展開できないものを展開します。

Dapper /その他のMicro ORM

  • データを取得するために使用されます

私は助けることができませんが、これは私がさまざまなビットとすべてのものを使用するフランケンシュタインの解決策のビットであると感じています。私はまた、SSDTとEFがうまく連携しているかどうかはまだ分かっていません。この簡単な例はうまくいくようです:

// Combo of Dapper, EF and a stored proc that was published through SSDT
static void Main(string[] args)
{
  var connectionString = ConfigurationManager
    .ConnectionStrings["DbDataContext"].ConnectionString;

  using (var conn = new SqlConnection(connectionString))
  using (var ctx = new DbDataContext())
  {
    conn.Open();

    var product = conn.Query<Product>("GetProduct", 
      commandType: CommandType.StoredProcedure).First();

    ctx.Products.Attach(product);

    var order = new Order
    {
      Product = product
    };

    ctx.Orders.Add(order);

    ctx.SaveChanges();

  }
}

このアプローチはうまくいくと思われますが、それも面倒です。しかしSSDTをあきらめると、SQLのコンパイル時間チェックができなくなるでしょう。もしEntity Frameworkをあきらめたら、コードに先立ち、簡単に挿入することができなくなります。パフォーマンスの大きな塊でアウト。

私が見過ごしている選択肢はありますか?そうでない場合は、ここで最善のアプローチは何ですか?

人気のある回答

ServiceStack.Ormを実際にチェックアウトする必要があります。

https://github.com/ServiceStack/ServiceStack.OrmLite

それは、ttファイルを使用するモデルgenを含む機能のトーンを持っており、dbテーブルも作成することができます。

LINQをサポートしています。

そして、その狂った稲妻は高速です。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow