6

ここにあるMvcMusicStoreチュートリアルを読み終えたところです。これは、実用的なソースコードを備えた優れたチュートリアルです。これまでのところ、私のお気に入りのMVCv2チュートリアルの1つです。

このチュートリアルは、ADO.NET Entity Frameworkの使用方法を初めて紹介したものであり、そのほとんどが非常に迅速でわかりやすいものであったことを認めなければなりません。ただ、保守性が気になります。顧客が新しいフィールド、テーブル、および関係を必要とする追加機能をサイトに要求する場合、このフレームワークはどの程度カスタマイズ可能ですか?

エンティティモデルは基本的にドラッグアンドドロップのコンピューター生成コードであるため、顧客の変更注文を効率的に実行できないことを非常に心配しています。コードジェネレーターに関する私の経験は良くありません。モデルの内臓に何かがうまくいかず、こぶのあるダンプを元に戻すことができない場合はどうなりますか?

長期的には、人間が読み取って編集できる手書きのモデルを使用する方が、EntityFrameworkを使用するよりも効率的なコースであるかどうか疑問に思います。

エンティティフレームワークを使用して、非常に流動的な開発環境で快適に使用できると言う人はいますか?

4

4 に答える 4

7

現在のプロジェクトでは、エンティティフレームワーク(V1.0)を約1年間使用しています。数百のテーブルがあり、すべてedmxに追加されています。私たちが直面している問題(新しいエンティティフレームワークがこれらの問題を解決するかどうかはわかりませんが)

  1. VS.net IDEに慣れている場合は、IDEからすべてのドラッグ/ドロップ操作を実行することに慣れています。問題は、edmxが数百のテーブルをホストすると、IDEが実際に停止し、応答するまで3〜4分待つ必要があることです。

  2. テーブルが非常に多いため、edmxで行う編集には時間がかかります。

  3. バージョン管理を使用する場合、10000行のXMLを比較するのは非常に困難です。それぞれが10000行のedmxを持つ2つのブランチ、テーブル、テーブル間の新しい関連付け、削除された関連付け、およびxmlの比較を行ったり来たりすることを検討してください。2つの大きなedmxファイルのマージを真剣に考えている場合は、優れたxml比較ツールが必要になります。

  4. パフォーマンス上の理由から、csdl、msl、ssdlを埋め込みリソースとして作成する必要がありました

  5. edmxは常にDBと同期している必要があります。または、少なくともedmxを更新しようとすると、同期が試みられ、同期していない場合は不明瞭なエラーがスローされる可能性があります。

  6. エンティティ(テーブル/ビュー)には常に主キーが必要であることに注意してください。そうしないと、あいまいなエラーが発生します。ここで私の他の質問を参照してください

私たちがしたこと/EFを使用するときに将来検討する可能性があること

  1. 論理的にグループ化/リンクされたテーブルに1つのedmxを使用して、複数のedmxを使用します。これを行う場合、各edmxは独自の名前空間に存在する必要があることに注意してください。同じ名前空間の2つのedmxに2つの関連テーブル(たとえば、個人と住所)を追加しようとすると、外部キー関係がすでに定義されていることを示すコンパイラエラーが発生します。(ヒント:フォルダーを作成し、このフォルダーの下にedmxを作成します。フォルダーがない状態でedmxの名前空間を変更しようとすると、次に開いたり編集したときに名前空間が正しく保存されません)

    fewer tables in edmx => less heavy
    container => good
    

    edmxのテーブルが少ない=>2つのブランチをマージするときにマージしやすく

  2. オブジェクトコンテキストはスレッドセーフではないという事実に注意してください

  3. リポジトリ(または使用するDAO)は、リポジトリが作成するコンテナの作成と破棄を担当する必要があります。特にWebアプリでのDIフレームワークの使用は、私たちにとって複雑なことです。Webリクエストはスレッドプールから提供され、スレッド自体が破棄されなかったため、Webリクエストが処理された後にコンテナが適切に破棄されませんでした。コンテナが再利用され(スレッドが再利用されたとき)、多くの同時実行の問題が発生しました

  4. VSIDEを信用しないでください。優れたXMLエディターを入手し、edmxファイルを編集する方法を知ってください(ただし、デザイナーを編集する必要はありません)。手を汚す

  5. クエリを実行するときは、常に常に(これを十分に強調することはできません)SQLプロファイラー(つまり、コードのすべてのステップを意味します)を実行します。クエリは複雑に見えるかもしれませんが、DBの例に何度ヒットしたかを知って驚かれることでしょう:(申し訳ありませんが、コードを正しい形式に取得できません。誰かがそれをフォーマットできますか?)

    var myOrders = from t in context.Table where t.CustomerID=123
    

    tを選択します。//上記のクエリはまだ実行されていません

    if(myOrders.Count>0)//DB query to find count { var firstOrder = myOrders.First()//DB query to get first result }

    より良いアプローチ

    //クエリがマテリアライズされ、ToList()を使用しているためDBに1回ヒットしますvar myOrders =(Context.tablesのtからt.customerID = 123 select t).ToList();

    if(myOrders.Count>0)//no DB hit
    {
    //do something
    var myOrder = myOrders[0];//no DB hit
    }
    
  6. トラッキングを使用し、トラッキングを使用しない場合(読み取り専用の場合)を把握し、Webアプリは書き込みよりも多くの読み取りを実行します。コンテナを初期化するときに適切に設定してください

  7. コンパイルされたクエリを忘れましたか?もっとグッズを探すにはこちらをご覧ください

  8. DBから数千行を取得するときは、メモリが不足しないように、必ずIQueryableを使用し、objectContextをデタッチしてください。

アップデート:

Julie Lermanは、同様のソリューションで同じ問題に対処します。彼女の投稿は、膨大な数のテーブルを処理するためのWardの作業も示しています。

于 2010-06-24T18:59:53.367 に答える
1

私はEntityFrameworkにあまり詳しくありませんが、手動で編集できるEDMファイルを生成するだけだと思います。デザイナーが生成するLinq-to-SQLDBMLファイルを使用してこれを頻繁に行ったことは知っています(デザイナーを使用して微調整するよりも、手作業で編集する方が速い場合がよくあります)。

于 2010-06-24T17:54:32.837 に答える
1

開発者がこれについて何らかの洞察を提供できるかどうか私が興味を持っていることをあなたは知っています。Entity Frameworkの例は、約10〜20個のテーブルで構成されているように見えますが、これは実際には小規模です。

数百または数千のテーブルがあるデータベースでEFを使用するのはどうですか?

個人的には、LINQ-to-SQLに追われ、EFの方向性を確認するために、1年ほど延期している開発者や組織をいくつか知っています。

于 2010-06-24T18:06:36.497 に答える
1

Entity Framework 4(Visual Studio 2010を使用)以降、生成されたコードはT4(Text Template Transformation Toolkit)ファイルから出力され、編集できるため、生成されるものを完全に制御できます。T4に関する情報の宝庫であるOlegSychのブログを参照してください。コード生成は問題ではなく、T4は非常に多くの視点を開くので、私はこれなしでは生きていけません。

私は現在、データアクセス層にEntity Framework 4を使用し、アジャイルプロジェクト管理方法としてスクラムを使用するプロジェクトに取り組んでいます。あるスプリントから別のスプリントまで、いくつかのテーブルが追加され、他の変更された、新しい要件が追加されています。潜在的なEFの問題が発生するたびに(データベースのデフォルト値がデフォルトで.edmxファイルに保持されないことを知っている場合や、null許容列をnull許容でない列に変更してデザイナーを更新しても、マップされたプロパティは変更されないなど)状態)、あなたは行ってもいいです。

編集:あなたの質問に答えるために、コード生成がEFをサポートするT4ではなくT4に基づいているのはEF4です。EF 3.5(または必要に応じてEF 1.0)では、理論的には、T4を最初から記述し、T4コードでEDMXファイルを解析して、エンティティを生成することでT4を使用できます。これらすべてがすでにEF4によって行われていることを考えると、かなりの作業になります。さらに、Entity Framework 3.5は1種類のエンティティのみをサポートしますが、EF 4はPOCOエンティティ(何も知らない)の組み込みまたはダウンロード可能なテンプレートです。永続性について)、自己追跡エンティティ..

Entity Framework自体を考えると、最初のリリースでは多くの機能が不足していたと思います。また、使用可能であるにもかかわらず、使用するのは非常に苛立たしいものでした。EF4ははるかに改善されています。それはまだいくつかの基本的な機能(列挙型サポートなど)を欠いていますが、今では私のデータアクセス層として選択されています。

于 2010-06-24T18:44:24.160 に答える