ADO.NET Entity Frameworkの継承

モーフィアス、何の話をしているの?




すべての人に挨拶!

Habréに関する私の最初の記事はHabrausersから高く評価されました。 さて、記事について意見を述べてくれた皆さんのおかげで、私はあなたを読んで喜んでいます、私は続けます。



新しい記事では、継承についてお話したいと思います。 率直に言って、ADO.NET Entity Frameworkを勉強する前は、オブジェクト指向のデータベースラッパーでプロジェクトにエンティティの継承を導入することすら考えていませんでした。 通常、ベースは継承をできるだけ避けるように構築されました。 しかし、時には地平線に迫りましたが、そうでした。 次に、既存のテーブルから継承された2つの非常に単純なクラスをプロジェクトに追加した方法を説明します。



繰り返しますが、私は理論を掘り下げることはしないことに注意し、実際にすべてを示します。 理論的には、別のシリーズの記事を作成します。



そしてそう



すぐに言います。 この記事の作成中に発生したエラーを分析して、コードに1時間を費やしました。 そして、私の目標は、ANEFでの継承の実装方法を示すだけでなく、回避できる典型的なエラーを示すことでもあります。



はい、ところで、我々は暗黙のうちにこれに同意しました: ANEF = A DO。 N ET E ntity F ramework



これが私のデータベースです。



最初の記事の時から 、データベース構造は少し変更されましたが、それでも非常にシンプルなままです。 当初、データベースにはPostとUserの2つのテーブルしかありませんでしたが、現在はスキームが少し複雑でした。



  1. BlogPostテーブルを作成しました。 これの意味は、私のシステムでは、Postはブログ投稿だけでなく、コメント、メッセージ、そして一般に、あるユーザーが別のユーザーに転送できるすべてのものになるということです。 このようなスキームは、教育目的のみで作成されます。 ほとんどのシステムでは、コメントは非常に重要なテーブルであり、常に多くのエントリが存在し、システムで最も負荷の高いテーブルであるためです。 したがって、BlogPostはPostからすべてのデータを継承し、追加情報を保持する必要があります。 私のシステムでは、各ブログ投稿の下にあるコメントへのリンクの名前をユーザーに書いてほしい。 例:「ここのハーネス」、「考えてみて」。 これはいくつかの多様性をもたらします。 それで、私のすべての要望はDBスキーマにはっきりと現れています。 ここでは、最初のタイプの継承を適用​​します-各エンティティには独自のテーブルがあります。
  2. また、データベースモデルに単純なユーザーと管理者がいると便利です。 したがって、IsAdminフィールドを使用して、2番目のタイプの継承を実行します-複数のエンティティに対して1つのテーブル。 値により、エンティティはこのフィールドにシフトされます。




すぐに予約します。 ここで私は最大の間違いを犯しました。これはフォーラムで作業するのに20分かかりました。 しかし、一般的に、彼女は非常に愚かであり、見落としから作られました。







このスクリーンショットは、データベース内の接続の正しい配置です。 初めて、私は愚かにそれらを反対方向に向けました。そのため、私はBlogPost Primaryテーブルを作成しました。 さて、それは起こります、さらに進んでみましょう。



データベースプロジェクトでスタジオに入り、データベースからスキーマを更新します。 同時に、新しいエンティティBlogPostが表示されます。 すべてが順調です、登場しました。 接続しても。 最初にこのリンクを削除してください。 継承されたエンティティでは必要ありません。 その後-エンティティポストコンテキストメニューで、新しい継承を追加します。 このようなものが出てきます:





そして、ここで視覚的な開発環境に失望したのは初めてです。 プロジェクトの検証を開始します(ANEFの継承で作業を完全にマスターしていない場合は、くしゃみのたびにこの検証を開始することをお勧めします)。 そして、バングとの検証が落ちます。 問題は、通常の継承を組織する前に、もう少しシャーマニズムを実行し、何かを理解する必要があることです。

BlogPostとPostの2つのテーブルがあります。 SQLによると、BlogPost.PostIdとPost.Idのテーブルには2つのキーがあります。 ANEFは実際、BlogPostテーブルにはBlogPost.PostIdキーがなく、Post.Idキーがあると非常に正しく信じています。 原則として、これは論理的なものではなく、1対1の接続であるため、別のキーを使用する必要があるのはなぜですか? それも本当です。 Entity BlogPostからPostIdパラメーターを削除します。 その後、検証は再び崩壊します。 そうです。 テーブルにPostId値がありますが、マッピングはありません。 この欠陥を修正します。







PostIdテーブルフィールドのマッピングをId変数に設定します。 問題はすぐに発生します。BlogPostテーブルのId変数をどこで定義したのでしょうか。 先ほど言ったように、ANEFはEntity PostとBlogPostにはキーが1つしかないと考えているため、BlogPostテーブルに暗黙的に追加しました。 その結果、最終的なエンティティは次のようになります。





すべてのもののように見えますが、今では使用できます。 コンパイルしてみてください。

これは、分析した最初のタイプの継承です。 各エンティティは、データベース内の独自のテーブルに関連付けられています。 では、2つ目のタイプの継承に移りましょう。ここでは、1つのテーブルといくつかのタイプのエンティティしかありません。



私が言ったように-私はエンティティ管理者をユーザーから分離したかった。 ANEFを使用すると、これは非常に簡単です。 コンテキストメニューから、新しいエンティティを追加し、エンティティユーザーから継承されていることを示します。 エンティティUserおよびAdminからIsAdminプロパティをすぐに削除できます。わかりやすくするために残していますが、検証はパスしません。 要するに、これは継承の最初の近似がどのように見えるかです:







繰り返しになりますが、少し考えてみる必要があります。 最初に、マッピング条件を構成する必要があります。 特に、今ではすべてのユーザーとすべての管理者が同じになり、それらを区別するものは何もありません。 エンティティマッピングに渡して、マッピングを実行する条件を選択します。





ここでは、IsAdminフィールドを既に削除していますが、これは不要です。さらに、ANEFはマッピング条件であるため、このフィールドを変数に入れることができません。 さて、これで管理者ができましたが、ユーザーテーブルで何が起こるでしょうか? それは別の大きな間違いでした。 かなり単純な事実が私に伝わるまで、私はさらに5分間フォーラムを登りました:何らかの条件でエントリをAdminテーブルにフィルターした場合、これは他のすべてのエントリが自動的にユーザーテーブルに移動することを意味しません。 したがって、Userテーブルのマッピングに条件を含め、このテーブルの残りのエントリを除外することも必要です。



すぐに予約すると、ブールではなくInt16という名前にもかかわらず、IsAdminフィールドがあるため、IsAdmin = 1およびIsAdmin = 0に基づいてスクリーニングが実行されました。 。



さて、2つの非常にシンプルな、しかし継承されたエンティティを形成しました。 どのプロパティとどのように継承するかは重要ではありません。 あなた自身でこれを試すことができます。 私の目標は、この継承を実行する方法を示すことでした。 できた はじめに。



これにしか気がつかない。 ANEFの継承を詳しく調べましたが、継承を使用すると実装が本当に容易になるいくつかのスキームを見つけました。 たとえば、私たちのシステムの1つに、個人が職場、教育、科学出版物など、自分に関するさまざまなデータを入力できるポートフォリオを操作するシステムがありました。 ポートフォリオ内のレコードのタイプごとに個別のテーブルがありましたが、確かにあなたに伝えることができます-このデータを選択したSQLクエリは地獄でした。 すべてが非常に不快で曲がっていました。 その後、継承を使用すると、PortfolioEntryなどの基本クラスのリスト<>が作成され、これを使用して迅速かつ便利に作業できます。 これは私の人生の例であり、ANEFの内部を掘り下げると、コード内にそのような例がたくさん見つかると思います。



次回の記事では、継承されたエンティティを正しく処理する方法を示すコードを追加していきます。



PSシステムを自分で書くのは退屈です。 それで、なぜ私はCollective Intelligenceを自分自身に招待し、これらすべてについて彼と相談しないのかと考えました。 来週の土曜日に、私は2〜3人の興味のある人を招待して、等しい条件でANEFを拷問し、テストを行い、コードを書き、理論を説明できると思われます。 私はすべてを追跡していません。 3〜4時間のイベントの最後に、参加者は無料のビールを受け取ります。 誰かがそのようなグループテストに興味があるなら-個人で書いて、私たちは考え直します。



PPSこれはすべて、Visual StudioおよびManagement Studioの無料バージョンで行われました。 マイクロソフトは、その製品を最も残忍な方法で削減していません。




All Articles