エンティティフレームワークはトラフィックの多いWebサイトに適していますか?


176

Entity Framework 4は、潜在的に1000ヒット/秒のパブリックWebサイトに適したソリューションですか?

私の理解では、EFは主に小規模またはイントラネットのWebサイト向けの実行可能なソリューションですが、人気のあるコミュニティWebサイトのようなものには簡単に拡張できません(SOがLINQ to SQLを使用していることは知っていますが、もっと例/証拠が欲しいです) ..)

現在、純粋なADO.NETアプローチを選択するか、EF4を選択するかの岐路に立っています。EFを使用した開発者の生産性の向上は、ADO.NET(ストアドプロシージャを使用)のパフォーマンスの低下ときめ細かいアクセスに値すると思いますか?トラフィックの多いWebサイトが直面する可能性のある深刻な問題は、EFを使用していたのですか?

前もって感謝します。


1
あなたはスケーリングを理解していません。スケーリングとは、10倍の容量を追加したときにスループットが10倍になることを意味します。EFはなぜこれが起こるのを防ぐのでしょうか?データベースのワークロードに一定の要因オーバーヘッドが追加されます。
usr

回答:


152

それはあなたどれだけの抽象化が必要かに少し依存します。すべてが妥協です。たとえば、EFとNHibernateは、興味深いエキゾチックなモデルでデータを表現するための優れた柔軟性を導入しますが、結果としてオーバーヘッド追加されます。顕著なオーバーヘッド。

データベースプロバイダーと異なるクライアントごとのテーブルレイアウトを切り替える必要がなく、データが主に読み取られる場合、およびEF、SSRSで同じモデルを使用する必要がない場合、ADO.NET Data Servicesなど-絶対的なパフォーマンスを主要な尺度として使用する場合は、dapperを見るよりもはるかに悪いことがあります。LINQ-to-SQLとEFの両方に基づいたテストでは、EFは、おそらく抽象化レイヤー(ストレージモデルなど)と実体化のために、生の読み取りパフォーマンスの点で大幅に遅いことがわかります。

ここSOでは、生のパフォーマンスに強迫観念があり、速度を上げるために抽象化を失うという開発ヒットを喜んで受けています。そのため、データベースを照会するための主要なツールはdapperです。これにより、既存のLINQ-to-SQLモデルを使用することもできますが、単純に:ヒープが高速になります。パフォーマンステストでは、すべてのADO.NETコード(パラメーター、データリーダーなど)を手動で記述するのと基本的にまったく同じパフォーマンスですが、列名を間違えるリスクはありません。ただし、SQLベースです(ただし、選択したポイズンがSPROCであれば喜んで使用できます)。これの利点は追加の処理が必要ないことですが、SQLが好きな人のためのシステムです。私が考える:悪いことではありません!

たとえば、一般的なクエリは次のとおりです。

int customerId = ...
var orders = connection.Query<Order>(
    "select * from Orders where CustomerId = @customerId ",
    new { customerId }).ToList();

これは便利で、インジェクションセーフなどです-しかし、大量のデータリーダーグーはありません。水平および垂直の両方のパーティションを処理して複雑な構造をロードできますが、遅延ロードはサポートしていません(ただし、非常に明示的なロードの大ファン-驚きは少ない)。

この回答では、EF 大量の作業に適していないと言っているわけではありません。単純に:私はdapperがそれをやっいるのを知っています。


25
dapperの場合は+1。読み取りモデルに複雑なORMを使用する必要はありません。今私たちが取っているアプローチは、ドメインモデルにORMを使用することです(実際には、ORMの派手なものが実際に役立ちます)。また、読み取りモデルにはdapperを使用します。これにより、超高速アプリケーションが実現します。

2
@Marc、すばらしい答えをありがとう-私はついに自信を持って決定を下すことができます!dapperについては、後で詳しく説明します。本当に1つのファイルである方法が本当に好きです:)

3
自分でORMを作成しました。その遅い。私はダッパーを見て、それが好きだった。今、私はすべての読み取りにdapperを使用し、挿入に独自のORMを使用します(FK、トランザクション、およびすべてのものをサポートしています)。私が今まで書いた中で最も簡単で最も読みやすいコード。

2
@ acidzombie24 dapperはトランザクションをサポートし、dapperのcontrib部分(nuget deployの一部ではない)はinsertなどのオプションを取得しています。完全を期すために言及するだけです。ダッパーが便利だったことがうれしいです。
マークグラヴェル

1
@anynameトピックに関するビデオコースを作成したことはありません。そこにいくつかのビデオがありますが、私ではありません。私は書き言葉の人になりがちです
マーク・グラヴェル

217

「どちらのORMを使用すべきか」という質問は、大規模なアプリケーションでの全体的なデータアクセス戦略とパフォーマンスの最適化に関して、本当に大きな氷山の一角を狙っています。

以下のものはすべて(おおまかに重要度の順に)スループットに影響を与え、それらはすべて、ほとんどの主要なORMフレームワークによって(場合によっては異なる方法で)処理されます。

  1. データベースの設計と保守

    これは、データ駆動型アプリケーションまたはWebサイトのスループットの最も重要な決定要因であり、プログラマによって完全に無視される場合がほとんどです。

    適切な正規化手法を使用しないと、サイトは運命づけられます。主キーがない場合、ほとんどすべてのクエリが犬のように遅くなります。正当な理由がない限り、キーと値のペア(エンティティ属性値)のテーブルを使用するなど、よく知られているアンチパターンを使用すると、物理的な読み取りと書き込みの数が急増します。

    ページ圧縮、FILESTREAMストレージ(バイナリデータ用)、SPARSE列、hierarchyid階層用など(すべてのSQL Serverの例)など、データベースが提供する機能を利用しない場合、あなた見ることできるパフォーマンス。

    データベースを設計し、少なくとも当分の間はデータベースが可能な限り優れていると確信した、データアクセス戦略について心配する必要があります。

  2. Eager vs. Lazy Loading

    ほとんどのORMは、リレーションシップの遅延読み込みと呼ばれる手法を使用しました。つまり、既定では、一度に1つのエンティティ(テーブル行)を読み込み、1つ以上の関連する(外部のキー)行。

    これは良いことでも悪いことでもありません。むしろ、データを実際にどのように処理するか、そしてどの程度事前に知っているかに依存します。時々、遅延読み込みは絶対に正しいことです。たとえば、NHibernate は何も照会せず、特定のIDのプロキシを単に生成することを決定する場合があります。必要なのがIDだけである場合、なぜさらに要求する必要があるのですか?一方、3レベルの階層内のすべての要素のツリーを印刷しようとすると、遅延読み込みはO(N²)操作になり、パフォーマンスが著しく低下します。

    「純粋なSQL」(つまり、生のADO.NETクエリ/ストアドプロシージャ)を使用することの興味深い利点の1つは、基本的に、特定の画面またはページを表示するために必要なデータを正確に考えることです。オームズと遅延ロード機能はありません防ぐためにこれをやってからあなたを、彼らはないあなたになる機会を与えて...よく、怠惰な、と誤ってあなたが実行するクエリの数を爆発します。そのため、ORMの熱心な読み込み機能を理解し、特定のページリクエストに対してサーバーに送信するクエリの数に常に注意する必要があります。

  3. キャッシング

    すべての主要なORMは、「アイデンティティキャッシュ」とも呼ばれる第1レベルのキャッシュを保持します。つまり、同じエンティティをそのIDで2回要求する場合、2回目の往復は必要ありません。 )オプティミスティックな同時実行性を使用できます。

    L1キャッシュはL2SとEFではかなり不透明です。動作していることを信頼する必要があります。NHibernateはそれについてより明示的です(Get/ Loadvs. Query/ QueryOver)。それでも、できる限りIDで照会しようとする限り、ここで問題ありません。多くの人がL1キャッシュを忘れて、ID以外の何か(つまり、ルックアップフィールド)で同じエンティティを繰り返し検索します。これを行う必要がある場合は、将来の検索のためにIDまたはエンティティ全体を保存する必要があります。

    レベル2キャッシュ(「クエリキャッシュ」)もあります。NHibernateにはこのビルトインがあります。Linq to SQLとEntity Frameworkにはクエリコンパイルされており、クエリ式自体をコンパイルすることでアプリサーバーの負荷を大幅に削減できますが、データはキャッシュされません。Microsoftは、これをデータアクセスの問題ではなくアプリケーションの問題と考えているようです。これは、L2SとEFの両方の大きな弱点です。言うまでもなく、「生の」SQLの弱点でもあります。基本的にNHibernate以外のORMで非常に優れたパフォーマンスを得るには、独自のキャッシュファサードを実装する必要があります。

    EF4用のL2キャッシュ「拡張」もありますが、これは大丈夫ですが、実際にはアプリケーションレベルのキャッシュの大規模な代替ではありません。

  4. クエリ数

    リレーショナルデータベースはデータセットに基づいています。短時間で大量のデータを生成することは非常に得意ですが、すべてのコマンドにある程度のオーバーヘッドが伴うため、クエリの待機時間の点ではそれほど優れていません。適切に設計されたアプリは、このDBMSの長所を活用し、クエリの数を最小限に抑え、それぞれのデータ量を最大化するよう努める必要があります。

    これで、1行だけが必要な場合にデータベース全体を照会することは言っていません。あなたが必要な場合は、私が言っていることは、あるCustomerAddressPhoneCreditCard、そしてOrder、あなたがすべき、単一のページを提供するために同時に行すべてを聞いて、同時にそれらすべてに対して個別に各クエリを実行しません。それよりも悪いこともあります。同じCustomerレコードを連続して5回クエリするコードがあります。最初にを取得しId、次にName、次にEmailAddress、それから...とんでもないほど非効率的です。

    すべてがまったく異なるデータセットで動作する複数のクエリを実行する必要がある場合でも、通常はすべてを単一の「スクリプト」としてデータベースに送信し、複数の結果セットを返す方が効率的です。これは、データの総量ではなく、関心のあるオーバーヘッドです。

    これは常識のように聞こえるかもしれませんが、多くの場合、アプリケーションのさまざまな部分で実行されているすべてのクエリを追跡するのは本当に簡単です。メンバーシッププロバイダーはユーザー/ロールテーブルを照会し、ヘッダーアクションはショッピングカートを照会し、メニューアクションはサイトマップテーブルを照会し、サイドバーアクションは注目製品リストを照会します。 Order History、Recently View、Category、Inventoryの各テーブルに個別にクエリを実行します。それを知る前に、ページの提供を開始する前に20のクエリを実行しています。パフォーマンスを完全に破壊するだけです。

    いくつかのフレームワーク-と私はここに主にNHibernateはと思っていますが-このことについて非常に巧妙であり、あなたはと呼ばれるものを使用することができ先物たバッチ全体のクエリアップをし、最後の可能な分で、一度にすべてを実行してみてください。私の知る限り、Microsoftテクノロジーのいずれかでこれを実行したい場合は、自分で作業します。アプリケーションロジックに組み込む必要があります。

  5. インデックス付け、述語、射影

    私が話す開発者の少なくとも50%、および一部のDBAでさえ、インデックスをカバーするという概念に問題があるようです。「まあ、Customer.Name列にはインデックスが付けられているので、名前に対して行うすべてのルックアップは高速でなければなりません。」Nameインデックス検索している特定の列をカバーしない限り、それはそのようには機能しません。SQL Serverでは、これINCLUDECREATE INDEXステートメントで行われます。

    SELECT *どこでもナイーブに使用している場合-プロジェクションを使用して明示的に指定しない限り、すべてのORMが多かれ少なかれそれを行います-DBMS は、カバーされていない列を含むため、インデックスを完全に無視することを選択できます。プロジェクションとは、たとえば、これを行う代わりに:

    from c in db.Customers where c.Name == "John Doe" select c
    

    代わりにこれを行います:

    from c in db.Customers where c.Name == "John Doe"
    select new { c.Id, c.Name }
    

    そして、この意志は、最も近代的なオームズのために、それだけで行くと照会するように指示Idし、Nameおそらくインデックスで覆われている列を(ではなくEmailLastActivityDateまたは他のものは何でもそこに固執する起こっ列)。

    また、不適切な述語を使用することで、インデックス作成のメリットを完全に吹き飛ばすことも非常に簡単です。例えば:

    from c in db.Customers where c.Name.Contains("Doe")
    

    ...前のクエリとほとんど同じように見えますが、実際にはに変換されるため、完全なテーブルまたはインデックスのスキャンになりLIKE '%Doe%'ます。同様に、疑わしく単純に見える別のクエリは次のとおりです。

    from c in db.Customers where (maxDate == null) || (c.BirthDate >= maxDate)
    

    にインデックスがあると仮定するとBirthDate、この述語は完全に役に立たない可能性が高くなります。ここでの私たちの仮想プログラマーは、明らかに一種の動的クエリを作成しようとしました(「そのパラメーターが指定されている場合のみ誕生日をフィルター処理する」)が、これは正しい方法ではありません。代わりにこのように書かれています:

    from c in db.Customers where c.BirthDate >= (maxDate ?? DateTime.MinValue)
    

    ...これで、DBエンジンはこれをパラメーター化してインデックスシークを行う方法を認識します。クエリ式に対する些細な、一見些細な変更がパフォーマンスに大きく影響する可能性があります。

    残念ながら、一般的にLINQは、このような不正なクエリを記述することがあまりにも簡単になり、時にはプロバイダは、クエリを実行し、最適化しようとしていた、そして時にはそうでないものを推測することができます。そのため、単純に古いSQLを記述しただけでは、(経験豊富なDBAにとっては)目がくらむほど明白な結果となる、いらいらするほど一貫性のない結果になります。

    基本的には、生成されたSQLとそれらが導く実行計画の両方に本当に注意を払わなければならないという事実に帰着します。期待する結果が得られない場合は、バイパスすることを恐れないでください。 ORMレイヤーはたまにSQLを手動でコーディングします。これは、EFだけでなく、すべての ORMに当てはまります。

  6. トランザクションとロック

    ミリ秒までの最新データを表示する必要がありますか?たぶん-それは依存します-おそらくそうではありません。残念なことに、Entity FrameworkからはnolockREAD UNCOMMITTEDトランザクションレベルでのみ使用できます(テーブルレベルでは使用できません)。実際、これについて特に信頼できるORMはありません。ダーティリードを実行する場合は、SQLレベルにドロップダウンし、アドホッククエリまたはストアドプロシージャを記述する必要があります。要するに、フレームワーク内でそれを行うのがどれほど簡単かということです。

    エンティティフレームワークはこの点で長い道のりを歩んできました-EF(.NET 3.5)のバージョン1は非常にひどく、「エンティティ」の抽象化を突破するのが非常に困難でしたが、今ではExecuteStoreQueryTranslateがあります。悪くない。あなたは彼らをたくさん使うので、これらの人と友達を作りましょう。

    また、書き込みロックとデッドロックの問題、およびデータベースにロックをできるだけ短時間保持する一般的な慣行もあります。この点で、ほとんどのORM(Entity Frameworkを含む)は、実際には作業単位パターン(EFではSaveChanges)をカプセル化するため、生のSQL より優れている傾向があります。言い換えると、作業ユニットをコミットするまで実際に変更がデータベースにプッシュされないという知識で、必要なときにいつでもエンティティを「挿入」、「更新」、または「削除」することができます。

    UOWは、長時間実行されるトランザクションに類似していないことに注意してください。UOWはORMの楽観的同時実行機能を引き続き使用し、メモリ内のすべての変更を追跡します。最終コミットまで単一のDMLステートメントは発行されません。これにより、トランザクション時間ができるだけ短くなります。生のSQLを使用してアプリケーションを構築する場合、この遅延動作を実現することは非常に困難です。

    EFにとってこれが具体的に意味すること:作業単位をできるだけ粗くし、絶対に必要になるまでコミットしないでください。これを行うと、個々のADO.NETコマンドをランダムに使用する場合よりもロックの競合がはるかに少なくなります。

結論として:

EFは、他のすべてのフレームワークが高トラフィック/高性能アプリケーションに適しているのと同様に、高トラフィック/高性能アプリケーションに適しています。重要なのは、それをどのように使用するかです。最も人気のあるフレームワークとそれらが提供する機能のパフォーマンスの簡単な比較を以下に示します(凡例:N =サポートなし、P =部分的、Y =はい/サポート)。

                                | L2S | EF1 | EF4 | NH3 | ADO
                                +-----+-----+-----+-----+-----
Lazy Loading (entities)         |  N  |  N  |  N  |  Y  |  N
Lazy Loading (relationships)    |  Y  |  Y  |  Y  |  Y  |  N
Eager Loading (global)          |  N  |  N  |  N  |  Y  |  N
Eager Loading (per-session)     |  Y  |  N  |  N  |  Y  |  N
Eager Loading (per-query)       |  N  |  Y  |  Y  |  Y  |  Y
Level 1 (Identity) Cache        |  Y  |  Y  |  Y  |  Y  |  N
Level 2 (Query) Cache           |  N  |  N  |  P  |  Y  |  N
Compiled Queries                |  Y  |  P  |  Y  |  N  | N/A
Multi-Queries                   |  N  |  N  |  N  |  Y  |  Y
Multiple Result Sets            |  Y  |  N  |  P  |  Y  |  Y
Futures                         |  N  |  N  |  N  |  Y  |  N
Explicit Locking (per-table)    |  N  |  N  |  N  |  P  |  Y
Transaction Isolation Level     |  Y  |  Y  |  Y  |  Y  |  Y
Ad-Hoc Queries                  |  Y  |  P  |  Y  |  Y  |  Y
Stored Procedures               |  Y  |  P  |  Y  |  Y  |  Y
Unit of Work                    |  Y  |  Y  |  Y  |  Y  |  N

ご覧のとおり、EF4(現在のバージョン)はそれほど悪くありませんが、パフォーマンスが主な関心事である場合はおそらく最適ではありません。NHibernateはこの分野でより成熟しており、Linq to SQLでさえ、EFがまだ提供していないパフォーマンス強化機能を提供します。生のADO.NETは、非常に特定のデータアクセスシナリオではより高速になることがよくありますが、すべての要素をまとめると、実際にはさまざまなフレームワークから得られる多くの重要な利点を提供しません。

そして、私が壊れた記録のように聞こえるように完全に確認するために、データベース、アプリケーション、およびデータアクセス戦略を適切に設計しなければ、これらはどれも重要ではありません。上記のチャートのすべての項目は、ベースラインを超えてパフォーマンスを改善するためのものです。ほとんどの場合、ベースライン自体が最も改善が必要なものです。


38
なんて素晴らしい包括的答えでしょう!

2
+1(できればもっと)-ここでしばらく見た中で最高の答えの1つで、1つまたは2つのことを学びました-これを共有してくれてありがとう!
-BrokenGlass

1
言及されたすべてに同意しなくても、これは素晴らしい答えです。ORMを比較するテーブルは常に正しいとは限りません。エンティティの遅延読み込みとは何ですか?遅延読み込み列を意味しますか?これはL2Sでサポートされています。なぜNHはコンパイルされたクエリをサポートしないと思いますか?名前付きHQLクエリはプリコンパイルできると思います。EF4は複数の結果セットをサポートしていません。
ラディスラフMrnka

11
修飾されていない「EFは高トラフィック/高性能アプリケーションに完全に適している」という声明に強く反対する必要がありますが、そうではないことを繰り返し見てきました。確かに、「高パフォーマンス」の意味に同意しないかもしれませんが、たとえば、Webページを500ミリ秒まで最適化し、その400ミリ秒以上をフレームワーク内で不可解に費やす(そして実際にSQL ヒットするのはわずか10ミリ秒)ことは、一部の状況では「うまくいきません」開発チームにとってはまったく受け入れられません。
ニッククレイバー

1
EFの先物に関する簡単なメモ。これらはMS EFチームによって公式に提供されるものではありませんが、IQueryable <>のFuture <>拡張機能を定義するサードパーティプロジェクトを通じて実現できます。たとえば、NuGetで利用可能なLoreSoftによるEntityFramework.Extended。運用アプリケーションでの私の個人的なテストでは、Futureを使用して単一のバッチで多数の非依存クエリ(すべてのクエリを並列に実行でき、以前のクエリの結果は必要ありません)をパックすると、パフォーマンスが最大10倍向上します。また、AsNoTracking()は、大量のレコードを読み取るだけでパフォーマンスを大幅に改善し、後で更新することはありません。
デビッドオリバンウビエト14年

38

編集: @Aaronaughtの素晴らしい答えに基づいて、EFでパフォーマンスをターゲットにするポイントをいくつか追加しています。これらの新しいポイントには、編集という接頭辞が付きます。


トラフィックの多いWebサイトでのパフォーマンスの最大の改善は、キャッシュ(=まずWebサーバー処理またはデータベースクエリの回避)に続いて、データベースクエリの実行中のスレッドブロッキングを回避するための非同期処理によって達成されます。

アプリケーションの要件とクエリの複雑さに常に依存するため、質問に対する防弾の答えはありません。真実は、EFを使用した開発者の生産性が複雑さを隠し、多くの場合、EFの不適切な使用とひどいパフォーマンスにつながることです。データアクセス用に高レベルの抽象化されたインターフェイスを公開でき、すべての場合にスムーズに機能するという考えは機能しません。ORMを使用しても、抽象化の背後で何が起こっているのか、そして抽象化を正しく使用する方法を知っている必要があります。

EFの以前の経験がない場合、パフォーマンスを扱うときに多くの課題に直面します。ADO.NETと比較して、EFを使用する場合、さらに多くの間違いを犯す可能性があります。また、EFでは多くの追加処理が行われるため、EFは常にネイティブADO.NETよりも大幅に遅くなります。これは、概念実証アプリケーションで簡単に測定できます。

EFから最高のパフォーマンスを得るには、おそらく次のことを行う必要があります。

  • SQLプロファイラーを使用してデータアクセスを非常に慎重に修正し、Linq-to-objectsではなくLinq-to-entitiesを正しく使用している場合は、LINQクエリを確認します
  • 次のような高度なEF最適化機能を非常に慎重に使用する MergeOption.NoTracking
  • 場合によってはESQLを使用する
  • 頻繁に実行されるクエリのプリコンパイル
  • EFキャッシングラッパーを利用して、一部のクエリの機能のような「セカンドレベルキャッシュ」を取得することを検討してください。
  • パフォーマンスの改善が必要な頻繁に使用される投影または集計のいくつかのシナリオでは、SQLビューまたはカスタムマップされたSQLクエリを使用します(EDMXファイルの手動メンテナンスが必要です)
  • LinqまたはESQLで定義されたときに十分なパフォーマンスを提供しないクエリには、ネイティブSQLとストアドプロシージャを使用します
  • 編集:クエリを慎重に使用します-すべてのクエリは、データベースへの個別の往復を行います。EFv4には、実行されたデータベースコマンドごとに複数の結果セットを使用できないため、クエリバッチ処理がありません。EFv4.5は、マップされたストアドプロシージャの複数の結果セットをサポートします。
  • 編集:データの変更を慎重に行います。再びEFは完全にコマンドのバッチ処理を欠い。そのため、ADO.NETでは、SqlCommand複数の挿入、更新、または削除を含むシングルを使用できますが、EFを使用すると、そのようなコマンドはすべてデータベースへの個別のラウンドトリップで実行されます。
  • 編集: IDマップ/ IDキャッシュを慎重に操作します。EFには、最初にキャッシュを照会するための特別なメソッド(GetByKeyObjectContext APIまたはFindDbContext API)があります。Linq-to-entitiesまたはESQLを使用すると、データベースへのラウンドトリップが作成され、その後、キャッシュから既存のインスタンスが返されます。
  • 編集:イーガーロードを慎重に使用します。1つの巨大なデータセットを生成するため、常にwin-winソリューションではありません。ご覧のとおり、それはさらに多くの複雑さであり、それが全体のポイントです。ORMはマッピングと実体化をより簡単にしますが、パフォーマンスを扱う場合はマッピングがより複雑になり、トレードオフが必要になります。

SOがまだL2Sを使用しているかどうかはわかりません。彼らはDapperと呼ばれる新しいオープンソースORMを開発しました。この開発の主なポイントはパフォーマンスの向上だったと思います。


ラディスラフ、それは本当に役立つ答えです。Dapperについて聞いたのはこれが初めてです(その結果、MassiveのPetaPocoが発見されました)。これは興味深いアイデアのようです。

1
SOは現在、LINQ to SQLとDapperの組み合わせを使用しているようです:samsaffron.com/archive/2011/03/30/…引用:「特定の問題に新しいORM [Dapper]を使用しています:パラメーター化されたSQLをビジネスオブジェクトにマッピングしています。完全なORMとしては使用していません。関係やその他の機能を実行しません。これにより、パフォーマンスが問題にならないLINQ-2-SQLを引き続き使用し、マッパーを使用するためにすべてのインラインSQLを移植できます。より速く、より柔軟だからです。」

5
@Slaumaよく、それは数ヶ月前の声明です。一般にSOに関するすべての新しい作業はDapperで行われます。たとえば、今日追加した新しいテーブルはdbmlファイルにもありません。
サムサフラン

1
@Sam:SOに関する現在のデータアクセス戦略に関する新しいブログ投稿はありますか?とても面白いでしょう!その間にDapperは拡張されましたか?私の理解では、Dapperは完全なORMではなく、リレーションシップをサポートしていません。また、更新、挿入、削除、トランザクション、変更追跡など
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.