エンティティフレームワークとLINQ to SQL


828

.NET v3.5 SP1が(VS2008 SP1とともに)リリースされたので、.NETエンティティフレームワークにアクセスできるようになりました。

私の質問はこれです。Entity FrameworkとLINQ to SQLをORMとして使用することを決定しようとすると、違いは何ですか?

私が理解しているように、エンティティフレームワーク(LINQ to Entitiesで使用する場合)は、LINQ to SQLの「兄貴」ですか?これが事実である場合-それにはどのような利点がありますか?LINQ to SQLだけではできないことは何ですか?


138
EFがリリースされてから長い時間が経っているため、ここに来た新しい開発者は間違った印象を得る可能性があるため、以下の答えを再検討する必要があると思います。EFは、初期のリリース以来、優れた使いやすいツールになりました。DBへの接続をセットアップするだけで、必要なものの90%に達します。経験豊富な観点から、非常に迅速な開発!そこから-LINQはあなたの親友です。それは高度にカスタマイズ可能で、MVCはそれを愛し、それを悪いと言う人々に-最初にそれを使用する方法を学んでください(そしてLINQも手に入れましょう)!
graumanoz 2013

10
ちょうどそれが明らかである-それはあなたが今選択するようなものではない-MSFTはEFを支持してLINQ2SQLを効果的に殺した。しかし、MSFTのオープンソースEFは、それが吸う量を減らし、間違いなく良くなっているという事実です。ただし、EFに参加するすべての人にとって、EFにはまだ多くの癖があることを理解してください。-私は1つについて掲載しましたstackoverflow.com/questions/305092/...
nikib3ro

4
@ kape123、(a)LINQ to SQLは「デッド」ではありません。それはまだ使用可能です。(b)LINQ to SQLは、Windows Phone 8開発における標準のデータアクセス方法です。
Ryan Lundy 2014年

9
@ user3308043、[引用が必要]。
Ryan Lundy

3
@キラレッサ-2010年現在(.NET4.0のリリースにより、私が見つけた最新の引用)、MSは LINQ2SQLへの投資が行われる可能性があることを認め、「全体的な投資の大部分はエンティティフレームワーク。"
kmote 2015

回答:


483

LINQ to SQLは、Microsoft SQL Serverで使用可能なデータベーステーブル、ビュー、Sproc、および関数の1対1のマッピングのみをサポートします。これは、比較的適切に設計されたSQL Serverデータベースへの迅速なデータアクセス構築に使用する優れたAPIです。LINQ2SQLは、C#3.0および.Net Framework 3.5で最初にリリースされました。

LINQ to Entities(ADO.Net Entity Framework)は、ORM(Object Relational Mapper)APIであり、オブジェクトドメインモデルの幅広い定義と、さまざまなADO.Netデータプロバイダーとの関係を可能にします。そのため、さまざまなデータベースベンダー、アプリケーションサーバー、またはプロトコルを組み合わせて、さまざまなテーブル、ソース、サービスなどから構築されるオブジェクトの集約マッシュアップを設計できます。ADO.NetFrameworkは、 .Net Framework 3.5 SP1。

これは、MSDNの優れた紹介記事です 。LINQからリレーショナルデータへの紹介


LINQ to SQLを使用してEFでクエリを実行しているようです
PositiveGuy

11
@CoffeeAddictは、LINQラムダを使用するスタイルが非常に似ていますが、各APIは完全に異なる基盤を持っています。例えばLINQ2SQLがL2Eがないのに対し、SQL関数の使用を可能にする、または少なくとも2008のようになかったSQLクエリ生成方法
クリス

2
EFオブジェクト指向のアプローチは、非常に簡単で使いやすく、非常に高速にコード化して管理できます。私にとっては、データにアクセスするための最良の方法です。
Antoine Pelletier

10
この答えは時代遅れです。Linq to SQLがone2manyマッピングをサポートするようになりました
George Lanetz

201

迅速で汚い答えは

  • LINQ to SQLは、そのための迅速で簡単な方法です。これは、あなたがより速く進むことを意味し、あなたがより小さなものに取り組んでいるなら、より速く配達するでしょう。
  • Entity Frameworkは、それを実行するための全面的で保留のない方法です。これは、より大きなものに取り組む場合、事前に時間をかけ、開発に時間がかかり、柔軟性が高まることを意味します。

32
また、EFの場合と同じことを行うために、L2Sを使用して記述するコード行を少なくする傾向があります。EFで遅延読み込みがないということは、何かが読み込まれたかどうかを常に確認していることを意味します。
ポールメンドーサ

ブラッド、eコマースサイトに何を提案しますか?つまり、単純なCRUD以外は何も表示されません...
PositiveGuy

2
@CoffeeAddict明らかに、最も投票された回答の上位3つは、単純なCRUDのL2Sを示しています
IsmailS

11
@Banford .NET 4.0のEFでは、L2Sよりも優れていると思います。L2Sが3.5のEFで欠けていた機能が.NET 4.0のEFに追加されました。.NET 4.0のEFにあるLINQステートメントは、L2Sのものとほとんど同じように見えます。EFは、L2Sが提供するものに加えて、今できることがいくつかあります。
ポールメンドーサ、

40
この回答は5年前のもので、かなり古くなっています。Entity Framework 6がベータ版になり、大幅に改善されました。遅延読み込み、列挙型のサポートなどが含まれます
Tim

109

LINQ to SQLは本当に死んでいますか?InfoQ.comのJonathan Allen著

Matt Warrenは[LINQ to SQL]を「存在することすら想定されていなかった」と説明しています。基本的に、実際のORMの準備が整うまでは、LINQを開発するのを支援するためのスタンドバイであると考えられていました。

...

Entity Frameworkの規模により、.NET 3.5 / Visual Studio 2008の締め切りに間に合わなくなりました。残念なことに「.NET 3.5 Service Pack 1」と名付けられ、サービスパックというよりはメジャーリリースのように完成しました。

...

複雑さのため、開発者は[ADO.NET Entity Framework]を好みません。

...

.NET 4.0以降、LINQ to Entitiesは、LINQ toリレーショナルシナリオに推奨されるデータアクセスソリューションになります。


56
実際、EFはデザイナーが貧弱で、非常にバグが多いため、EFは好きではありません。私はそれがそれほど複雑であるとは決して知りませんでした。
BlueRaja-Danny Pflughoeft、2010

12
多くの主要なeコマースサイトがLINQ to SQLを使用しています。例:Redbox、Stackoverflowなど
PositiveGuy

14
私はLINQ to SQLを使用する優れた開発者をたくさん知っており、これらの記事は完全に誇張されていると言います。同意する。LINQ to SQLは、強力な.comで使用されていますが、現在も使用されています。
PositiveGuy

4
はい、L2EFクエリの整数プロパティで.ToString()を呼び出しても例外は発生しません。
StingyJack

3
@ BlueRaja-DannyPflughoeft 5年以上経ってもまだ本当ですか?
Vikas Rana

94

@larsが投稿した記事には、明らかな違いがいくつかありますが、簡単な答えは次のとおりです。

  • L2Sは密結合です-オブジェクトプロパティをデータベースの特定のフィールドに、またはより正確に特定のデータベーススキーマにオブジェクトマッピング
  • L2SはSQL Serverでのみ機能します(私の知る限り)
  • EFでは、単一のクラスを複数のテーブルにマッピングできます
  • EFはMMの関係を処理します
  • EFは、任意のADO.NETデータプロバイダーをターゲットにすることができます。

当初の前提は、L2Sは迅速な開発用であり、EFはより「エンタープライズ」なn層アプリケーション用ですが、L2Sは少し不足しています。


13
「L2SはSQL Serverでのみ機能します(私の知る限り)」という更新が必要です。オープンソースプロジェクト「dblinq」は、LINQ to SQLアセンブリをMySQL、PostgreSQL、Ingres、Firebird、SQLiteと通信できるものに置き換えます。 ..およびMicrosoft SQL(もちろん)。
Contango 2010

1
待つ...だからEFは密結合DLオブジェクトを作成しないのですか?
PositiveGuy

7
L2Sはエンタープライズ対応のソリューションではないという当初の前提は、もはや正しくありません。StackOverflowはL2SやRedboxなどのその他の.comなどで動作します。
PositiveGuy

74

LINQ to SQL

  1. 同種データソース:SQL Server
  2. データ構造が適切に設計されている小規模プロジェクトのみに推奨
  3. SqlMetal.exeで再コンパイルせずにマッピングを変更できます
  4. .dbml(データベースマークアップ言語)
  5. テーブルとクラス間の1対1のマッピング
  6. TPH継承をサポート
  7. 複合型をサポートしていません
  8. ストレージファーストのアプローチ
  9. データベース中心のデータベースのビュー
  10. C#チームによって作成されました
  11. サポートされていますが、それ以上の改善は意図されていません

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

  1. Heterogeneusデータソース:多くのデータプロバイダーをサポート
  2. 以下を除くすべての新規プロジェクトに推奨:
    • 小さいもの(LINQ to SQL)
    • データソースがフラットファイル(ADO.NET)の場合
  3. モデルとマッピングファイルを設定するときに再コンパイルせずにマッピングを変更できます。メタデータアーティファクトプロセスを出力ディレクトリにコピーします。
  4. 以下を含む.edmx(エンティティデータモデル):
    • SSDL(ストレージスキーマ定義言語)
    • CSDL(概念スキーマ定義言語)
    • MSL(マッピング仕様言語)
  5. テーブルとクラス間の1対1、1対多、多対1のマッピング
  6. 継承をサポート:
    • TPH(階層ごとのテーブル)
    • TPT(タイプごとのテーブル)
    • TPC(具象クラスごとのテーブル)
  7. 複合型をサポート
  8. コードファースト、モデルファースト、ストレージファーストのアプローチ
  9. データベースのアプリケーション中心のビュー
  10. SQL Serverチームが作成
  11. Microsoft Data APIの将来

以下も参照してください。


6
これが最新かつ詳細な答えです。
ErTR 2016年

2
Entity Framework 、たとえば、あなたがを書いているときにLINQ to SQLを使用しませんdbSet<Orders>.Where()...ToList()か?Entity FrameworkがLINQ to SQLに反対するのは誤解を招くと思います。
Don Cheadle 2016年

4
@mmcrae EFはL2Sを使用せず、どちらも基礎となるデータベースへのlinqプロバイダーです。これをLinq-to-a-databaseと解釈すると、linq-to-objectsやlinq-to-xmlと同様に、どちらもlinq-to-a-databaseと同様です。しかし、いいえ、EFはL2Sを使用しません(またはその逆)。2つの完全に分離されたツール。
Maarten

4
「...小さなプロジェクトを除くすべての新しいプロジェクトに推奨」私は同意しません。コードファーストは、小規模なプロジェクトを実行するための非常に迅速な方法です。それ以外は、この質問に対するすばらしいアップデートです。
DrewJordan 2016年

51

Entity Frameworkでの私の経験は素晴らしいものではありませんでした。まず、EF基本クラスから継承する必要があるため、POCOに別れを告げます。あなたのデザインはEFの周りでなければなりません。LinqtoSQLを使用すると、既存のビジネスオブジェクトを使用できます。さらに、遅延読み込みはありません。自分で実装する必要があります。POCOと遅延読み込みを使用するための回避策はいくつかありますが、EFの準備がまだ整っていないため、これらはIMHOとして存在します。4.0以降に戻ってくる予定です


7
POCOサポートの欠如は、Entity FrameworkよりもLINQ to SQLを選択した最大の理由です。彼らが約束しているように、彼らがそれを次のバージョンに組み込むとき、私はEFを再訪するかもしれません。EFのPOCOを行う追加のプロジェクトがいくつかありますが、十分にクリーンではありません。
ジョセフフェリス

27
誰か(私のような)がPOCOの意味を知らない場合:Plain Old CLR Object
CBono

4
POCOをサポートしないことについての大騒ぎが何であるかは本当にわかりません...それは抽象化のレベルの1つです。ファクトリを作成し、データリポジトリを挿入してPOCOをそこに構築します。とにかく、それはおそらく良い考えです。
EightyOne Unite

3
私はPOCOがEF 4で可能であると聞きます
PositiveGuy

8
POCOサポートは最近利用可能になり、継承はエンティティクラス@CoffeeAddictの要件ではなくなりましたPOCOは特定のフレームワークに依存しない単純なオブジェクトであり、現代のエンティティフレームワークパターンの主要な部分です
Chris McGrath

46

簡単な言葉で何をいつ使用するかを説明する非常に良い答えがここに見つかりました:

使用するフレームワークの基本的な経験則は、プレゼンテーションレイヤーでのデータ編集の計画方法です。

  • Linq-To-Sql-プレゼンテーションレイヤーでデータの1対1の関係を編集する場合は、このフレームワークを使用します。つまり、1つのビューまたはページで複数のテーブルのデータを結合する予定はありません。

  • エンティティフレームワーク -ビューまたはページで複数のテーブルのデータを組み合わせる場合は、このフレームワークを使用します。これをより明確にするために、上記の用語は、表示されるだけでなく、ビューまたはページで操作されるデータに固有のものです。これは理解することが重要です。

Entity Frameworkを使用すると、テーブル化されたデータを「マージ」して編集可能なフォームでプレゼンテーションレイヤーに提示でき、そのフォームが送信されると、EFはさまざまなテーブルからすべてのデータを更新する方法を認識します。

L2SよりもEFを選択する理由はおそらくもっと正確ですが、これはおそらく理解するのが最も簡単な理由でしょう。L2Sには、ビューを表示するためにデータをマージする機能はありません。


36

私の印象は、Linq2Sqlがニーズに適合しない場合、データベースがかなり巨大であるか、設計が非常に悪いということです。Linq2Sqlを使用している大小のWebサイトが約10あります。Entityフレームワークを何度も調べましたが、Linq2Sqlで使用する理由がわかりません。つまり、データベースをモデルとして使用しようとしているので、モデルとデータベースの間に1対1のマッピングが既にあります。

現在の仕事では、200以上のテーブルを持つデータベースがあります。Linq2SqlよりもEntity Frameworkの利点を確認できる古いソリューションがたくさんある古いデータベースですが、データベースはアプリケーションのエンジンであり、データベースの設計が不適切であり、アプリケーションの動作が遅い場合は、データベースを再設計したいと思います。また、遅くなります。そのようなデータベースでEntityフレームワークを使用することは、悪いモデルを隠すクイックフィックスのようですが、そのようなデータベースから得られる悪いパフォーマンスを隠すことはできません。


1
ポイントが足りない-小さなデータベースでも、データベーステーブルとコード/ドメインオブジェクト間の1対1の関係とは異なるものが必要になる場合があります。バス/ドメインオブジェクトに必要な抽象化の程度によって異なります。
錬金術

18
:)今日、私は自分のビジネスエンティティをハンドコーディングするのが好きです。私はまだLinq2sqlを使用していますが、Linq2sqlを使用してデータを取得し、linq2sqlエンティティをカスタムビジネスエンティティに変換するリポジトリ内でのみ使用しています。or-mapperを使用するよりも少し手間がかかるかもしれませんが、それでもビジネス層にORマッパー固有のコードがないようにしたいです。
terjetyl 2010

25

2
答えの中のいくつかは正しくありません。Code Firstを使用する場合、EDMXは必要ありません。また、Code Firstを使用しているときにDIがどのように機能するか理解できません。
Maarten、2016年

1
また、Linq to SQLはモデルクラスからDBに問題なくデータを入力できます。DB自体も生成できるかどうかはわかりませんが、スキーマとテーブルの生成はLinq to SQLの機能に含まれます。
トムリント2016

答えをありがとう、使用時にsqlmetal.exe docs.microsoft.com/en-us/dotnet/framework/tools/…を使用してデータベースからコード/マッピングを生成できると思いますLinq to SQL
Vinod Srivastav

23

ここでの回答は、Linq2SqlとEFの多くの違いをカバーしていますが、あまり注目されていない重要な点があります。

マイクロソフトが提供:

  • SQL Server、OBDC、およびOLE DB用のADO.NETドライバー

サードパーティプロバイダー経由:

  • MySQL
  • オラクル
  • DB2
  • VistaDB
  • SQLite
  • PostgreSQL
  • Informix
  • U2
  • Sybase
  • Synergex
  • 火の鳥
  • Npgsql

いくつか例を挙げましょう。

これにより、EFはリレーショナルデータストアに対する強力なプログラミング抽象化となります。つまり、開発者は、基盤となるデータストアに関係なく、一貫したプログラミングモデルで作業できます。これは、広範囲の一般的なRDBMSと相互運用できることを確認したい製品を開発している状況で非常に役立ちます。

その抽象化が役立つもう1つの状況は、さまざまな顧客や組織内のさまざまなビジネスユニットと協力する開発チームの一員であり、RDBMSの数を減らして開発者の生産性を向上させたい場合です。さまざまなRDBMS上でさまざまなアプリケーションをサポートするために精通している。


15

EFを使用すると、同じデータベースモデル内で複数のデータベースを使用できないことがわかりました。しかし、linq2sqlでは、スキーマ名の前にデータベース名を付けるだけで済みます。

これが私が最初にlinq2sqlを使い始めた理由の1つでした。EFがこの機能をまだ許可しているかどうかはわかりませんが、EFがこれを許可しないことを意図していたことを読んだことを覚えています。


12

データベースが単純でシンプルな場合は、LINQ to SQLで十分です。テーブルの上に論理的/抽象化されたエンティティが必要な場合は、Entity Frameworkにアクセスしてください。


4
Entity Frameworkは、データベースの最上位の抽象化レイヤーを可能にします。今日の(私の意見では)多くのORマッパーの問題は、テーブルとクラス間の1対1のマッピングを提供することです。データベースモデルは、ビジネスモデルの観点からデータベースについて考える方法を常に反映しているわけではありません。
senfo 2008年

スペースが足りなくなりました。とにかく、私が上で言ったことに基づいて、私はあなたの答えが完全ではないと主張します。
senfo 2008年

7
これは本当に悪いアドバイスだと思います。L2Sは、データベースの単純さや複雑さに関係なく優れています。本当の罠は懸念を適切に分離していない。ビジネスレイヤーとデータアクセスレイヤーをマージして、すべてにLinqed upオブジェクトを使用しようとすると、L2S制限が見つかります。しかし、それは過度に単純化されたモノリシック設計の問題です。L2Sは優れたDALを作成します。クエリと永続性をビジネスルールとは別の問題と考える場合、長期的には多くの領域で多くの問題を回避できます。
mattmc3

1
これは私に何も伝えません。あなたの言葉で単純なものは何ですか?
PositiveGuy

1
「論理的/抽象的」の必要性の例として何を意味しますか。はい、私は抽象化が何であるかを知っていますが、あなたの文脈の例を教えてください...あなたが言っていることを正確に説明するために...それを説明してください、私に一般的な俗語を与えないでください...それは話者が言っていることに関連していますそれらの言葉はあなたがこれで何を意味するのか分かりません。
PositiveGuy

8

どちらもまだ独自のSQL 2008データ型をサポートしていません。私の見方との違いは、将来のリリースでエンティティが地理データタイプを中心にモデルを構築する機会がまだあり、Linq to SQLが廃止されることはないということです。

nHibernate、またはOpenAccessで何が起こっているのだろう...


3
SQL Server 2008 Spatialデータ型(Open Geospatial Consortium OGS)は、Entity Framework 5以降でサポートされています。他のプロバイダー(Devart for Oracle)もサポートされています。msdn.microsoft.com/en-us/data/dn194325を参照してください
subsci 2013

6

途中で奇妙なことを行わずに何かをすばやく開発する必要があり、テーブルを表すエンティティを持つ機能が必要な場合は、次のように考えます。

Linq2Sqlは優れた同盟国であり、LinQと一緒に使用することで、優れた開発タイミングが実現します。


4
「真ん中に奇妙なことはありません」、これであなたはどういう意味ですか。「真ん中の奇妙なもの」の例
PositiveGuy

この回答を編集または削除すると便利です。現代の開発にはもはや役立たず、人々を間違った軌道に乗せる可能性があります。
Giulio Caccin

6

私は、Linq-to-SQLを使用している大きなプロジェクトを持つ顧客のために働いています。Entity Frameworkには当時いくつかの主要な機能が欠けていて、Linq-to-SQLのパフォーマンスははるかに優れていたため、プロジェクトが開始されたとき、それは明らかな選択でした。

現在、EFは進化しており、Linq-to-SQLには非同期サポートが欠けているため、拡張性の高いサービスに最適です。1秒あたり100を超えるリクエストがある場合があり、データベースを最適化したにもかかわらず、ほとんどのクエリの完了には数ミリ秒かかります。同期データベース呼び出しのため、スレッドはブロックされ、他の要求には使用できません。

この機能のみを目的として、Entity Frameworkに切り替えることを検討しています。MicrosoftがLinq-to-SQLに非同期サポートを実装しなかったのは残念です(またはコミュニティがそれをできるように、オープンソース化したためです)。

2018年12月の補遺: Microsoftは.NET Coreに移行し、Linq-2-SQLは.NET Coreをサポートしていないため、EFに移行して、将来EF.Coreに移行できるようにする必要があります。

LLBLGenなど、検討する他のいくつかのオプションもあります。これはすでに存在しており、MSデータソリューション(ODBC、ADO、ADO.NET、Linq-2-SQL、EF、EF.core)よりも将来性が証明されている成熟したORMソリューションです。


2

Linq-to-SQL

SQL Serverのみをサポートするプロバイダーです。SQL Serverデータベーステーブルを.NETオブジェクトにマップするためのマッピングテクノロジーです。MicrosoftによるORMの最初の試み-オブジェクトリレーショナルマッパー。

Linq-to-Entities

同じアイデアですが、ORMとしてバックグラウンドでEntity Frameworkを使用します-再びMicrosoftから。これは、複数のデータベースをサポートします。エンティティフレームワークの主な利点は、開発者が任意のデータベースで作業できることで、異なる異なるデータベースで操作を実行するための構文を学ぶ必要がありません。

私の個人的な経験によると、Efの方が優れている(SQLについて何も知らない場合)LINQのパフォーマンスは、ラムダで記述されたEFの理由LINQ言語に比べて少し高速です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.