EF(コードファースト)でのWebシステム作成におけるコンテキストクラスの定義方法

このQ&Aのポイント
  • 既存のDBを使用することを考えている場合、コンテキストクラスの定義方法は1つ定義し、その中に100弱のエンティティの定義をする方法が適しています。また、web.configの接続定義も1つ定義します。
  • コンテキストクラスもエンティティクラスと同様に100弱定義し、web.configの接続定義も100弱定義する方法も考えられますが、データ取得時のパフォーマンスが悪化する可能性があるため、避けるべきです。
回答を見る
  • ベストアンサー

EF(コードファースト)のコンテキストクラスの定義

http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4codefirst01/ef4codefirst01_02.html こちらを参考にしてASP.net MVC + Entity Framework 4.1(コードファースト) のWebシステムを作ろうと考えています。 既存のDBを使用することを考えていて、DBに含まれるテーブル数は100弱となります。 それぞれのテーブルに対応するエンティティクラスを100弱定義し、これらを 登録するコンテキストクラスを作成しようと考えたのですが、 1.コンテキストクラスも100弱定義し、web.configの接続定義も100弱定義する。 2.コンテキストクラスは1つ定義し、その中に100弱のエンティティの定義をする。   web.configの接続定義は1つ定義する 上記の1、2のいずれが方向性として正しいものでしょうか? 2のほうがすっきりするとは思いますが、データ取得時にコンテキスト・クラスのインスタンスを 生成する際、余計なエンティティ定義も読み込まれるためパフォーマンスが悪いような気もします。 無視していいほど軽いのであれば、間違いなく2の方法を取るのですが…。

質問者が選んだベストアンサー

  • ベストアンサー
  • aspnet
  • ベストアンサー率79% (72/91)
回答No.1

自分も似たような案件を考えており、私見を述べさせてもらいます。。 結論から言いますと、おっしゃる中間の方法がベストかと思います。 ・データコンテキストクラスは意外と軽い 以前のDataSetに比べると、テーブルベースの属性が単純化されている関係で、オブジェクトサイズは半分以下になっています。 →以前ならリレーション取った10テーブルくらいでDataSetを分割していましたが、倍くらい収容してもさほどパフォーマンスは悪くならない。 ・Connectionは共用できる →1つでいい ・LINQ for Entity Frameworkでは、JoinやGroup Joinで容易にリレーションを再構築できる。 →常時緊密にリレーショナルなオブジェクトを生成しないものであれば、関連エンティティを複数のコンテキストに分割しても、上位DALのロジックはそれほど複雑化しない。ただし、過度に分割するのは禁物。 ということで、自分は ・Connection定義は1個を複数データコンテキストで使い回す ・リレーション系統を整理して、相互アクセス頻度の少ない「節」で切断し、データコンテキストを分ける。 データコンテキスト内は保守性や一覧性もあるので、20~25テーブル以下 あたりが一番スッキリするのではないかと思います。 1コンテキストにどの程度のテーブルが許容できるかは、リレーションと各テーブル対応クラスの複雑さによるので、何とも言えませんが。。100テーブルだと、保守性も悪いかと。

tattetatte
質問者

お礼

回答ありがとうございます。 ・Connection定義の件 参考にしたサイトで、命名規則としてWeb.configのconnectionStringsにDbContextと同名の定義をすべきと 書かれていましたが、確かにご指摘の通り使いまわすのがよさそうです。context内に下記記述をして、明示的に使いまわすようにしました。 protected override void OnModelCreating(DbModelBuilder modelBuilder) { this.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CommonDbConnection"].ToString(); } ・DbContext分割の件 確かに意味のある単位で適度に分割するのが良さそうです。 究極的にはmodel単位にDbContextを作成するということもありえますが、パフォーマンスと使い勝手を考慮する必要がありそうですね。

その他の回答 (1)

  • onos
  • ベストアンサー率81% (127/155)
回答No.2

このレベルでパフォーマンス考えたことないんですが。 コンテキストを分けたとき、複数のコンテキストにまたがる問い合わせを書いた場合にプログラムはJoin等を使ってすっきり書けても、実際のDBのへの問い合わせが複数回になってしまったり、本来絞り込んでとりだしたいデータが絞り込めない状態でメモリ上に載ってそこから絞り込みの操作がはいったり、といったことはないのでしょうか? そのあたりも考慮する必要があるのかな、と思います。

関連するQ&A

  • asp.net MVC

    asp.net MVC環境でもENTITY FRAMEWORK POCOについて質問です。 エンティティ・クラス(POCO)はデータベースのテーブルからしか定義(リンク)できない のでしょうか。 たとえばDBのビューをエンティティ・クラスとして定義はできないのでしょうか。 あるテーブルのあるフィールドをグループ化しSUMしたビューをエンティティ・クラスとして 定義したかったのです。 仮にできないとすると、LINQ to SQL などで加工(グループ化)するしかないのでしょうか。 もし、それしかできないとすると扱いずらさと、効率の悪さを感じます。 自分が分かっておらず方法があれば良いと思い、質問させていただきました。 ご教授よろしくお願いします。

  • ベースのクラスの型を定義して、 それをもとに派生?

    C# でクラスを作成する場合、 private int mintCODE = 0; (1) public int intCODE { get { return mintCODE; } set { mintCODE = value; } }(2) public string sqlFILENAME = "Master";(3) public string sqlCODE = "DB_CODE";(4) private SqlConnection _connector = new SqlConnection();(5) public DB_Master SELECT(SqlDataReader reader)(6) { DB_Master m = new DB_Master(); m.intCODE = DBReader(m.sqlCODE); ] return m; のようにクラス内の要素をひとつひとつ定義していきます。 getやset、そのほかDBのテーブル名もクラスごとに定義する必要がありますが、 クラス数が多ければ、同じような作業を繰り返す必要がでてきます。 このコーディングをコンパクトにできないものなのでしょうか? ベースのクラスの型を定義して、 それをもとに派生したクラスはパラメータを入力するだけで、 (1)(2)(3)(4)(5)(6) のようなメソッドやプロパティが利用できるような。。。 そのようなことは可能でしょうか? もしサンプルなどがあれば教えていただきたいのですが。

  • C++のクラス内で、ウインドウプロシージャなどの・・・

    Visual C++ 2008で、Windowsフォームアプリケーションを作っています。 .NET Frameworkでは実現できないウインドウを作るために、WindowsAPIに頼り始めたのですが これが分からないのでとても不便な状態なのですが WindowsAPIで使うための、ウインドウプロシージャや、ウインドウハンドルや、デバイスコンテキストハンドル・・・等を C++のクラスの中で、staticを付けずに普通のメンバとして組み込む事は、出来るのでしょうか? - - - - - - 今までは分からなかったので、とりあえずAPIに触れてみようと思いstaticをつけてどうにかやっていたのですが、それだとクラス内のインスタンスメンバにアクセスできないので、クラス内に作ってる意味がない感じになってしまいます。

  • E-RモデリングとUML

    E-RモデリングとUMLとの関係、どうなんでしょうか・・・ E-Rのエンティティ-インスタンスと、UMLのクラス-インスタンスとが対応しているように思います。 とすると、テーブル1つに対しオブジェクト1つ、となるのでしょうか?

  • typedef された型をテンプレートで見分ける方法

    Windows 環境では幾つかの型(少なくないと思いますが)を typedef で定義されています。 例えば SNMP 類だと typedef HANDLE HSNMP_ENTITY; typedef HANDLE HSNMP_CONTEXT; 等。 こういった HSNMP_ENTITY や HSNMP_CONTEXT を扱うAPI群を幾つかのクラス化する場合、 基本処理を1つのテンプレートクラスで書こうとして、代入オペレータ operator=(const TYPE& h); を書いても TYPE を見分けてくれません(HSNMP_ENTITYとHSNMP_CONTEXTとを)。 typedef が弱い型付けである為、止む無いと考え、各末端のテンプレートクラスの派生クラス毎に書く事で妥協しました。 うまい手があればご教授願います。

  • EF CodeFirst についての質問

    entity framework code first についての質問です。 既存のデータベースから移行するときに詰まってしまいました。お助けください。 複数の外部キーを同テーブルから参照している場合Entityクラスにはどう外部キーを書けばいいのでしょうか? 例 class Store{ public int StoreId {get;set;} public int UserId {get;set;} public int UserId2 {get;set;} * この部分です public virtual User User {get;set;} } class User{ public int UserId {get;set;} public int Name {get;set;} public virtual ICollection<Store> Stores { get; set; } } いろいろ検索して調べてみたのですが解決できませんでした。 よろしくお願いいたします。

  • DAOやVOクラスについて

    初めまして、プログラム初心者です。 最近、開発をやり始めたのですが、わからないこと だらけで困っています。 ■DAOクラスについて 一般的にどこまでの処理を書くものですか? DBへアクセスする為のオブジェクトということは わかるのですが、DBの接続文以外にSELECTやCREATE文 なども含めるのでしょうか?? また現在のプロジェクトの仕様として、1テーブル 1DAOということになっているのですが、これは 対象のテーブルごとに、DBへの接続文を書くイメージ なのでしょうか? ■VOクラスについて ネットなので調べると、$IDや$NAMEなど書いてありますが これは、テーブルのカラムのことを差しているのでしょうか? それとも、項目を定数値として持たせるクラスなのですか? 1テーブル1DAOの仕様を考慮した場合、VOクラスも1テーブルに つき1つということになるのでしょうか?? セッターやゲッターについても、ご教授頂けると助かります。 開発環境は、PHP5のMYSQLです。 質問が多岐に渡ってしまっていますが、どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP
  • 【ASP.NET MVC3】共通ビュークラス

    いつも大変にお世話になっています。 ASP.NET MVC3で作成しているシステムで、すべてのビューに、共通のプロパティを用意したいと考えております。 以前のASP.NETでは、System.Web.UI.Page を継承したカスタムクラスを継承していました。 public MyCustomPage : System.Web.UI.Page {  // 共通のプロパティやメソッド } public class Index : MyCustomPage {  public page_load(Object o, EventArgs e){ // ページロード処理 } }; このような継承定義をビューのクラスで行いたく思います。 MVC3のビューで、たとえば、MyViewModelというビューモデルを埋め込んだ、以下のようなクラスは、どのやって定義したら良いのでしょう? @inherits MyCustomView<MyViewModel> 土曜の夜だというのに、まだ帰れません(泣 何とぞよろしくお願い致します。

  • (続)テーブル定義書の出力

    こんにちは。 前回も同じ質問をさせていただき、回答をいただいたのですが、私の説明不足で回答者様の厚意を無駄にしてしまいました。 よろしければ、また、教えていただきたいと思います。 VisualBasicでデータベースに接続を行い(接続は完了しています。)テーブル定義書を出力したいときはどうしたらよいでしょうか?? 考えたのは ボタンクリック ↓ DB接続 ↓ 定義書の元になるデータを読み込む ↓ エクセルに書き込む なのですが…うまくいきませんでした。 DBにはうまく接続できるのですが… まともな開発が今回が初めてなので不安です

  • SQLServerで別インスタンスのデータベースのテーブルの結合はできますか?

    [インスタンスA] UserID=sa PassWord=****** DataBase=DB01 で接続されるテーブルDB01.Table1 と [インスタンスB] UserID=HogeUser PassWord=@@@@@@ DataBase=DB02 で接続されるテーブルDB02.Table2 の2つのテーブルを結合してプログラムから処理を行いたいのですが、 可能なのでしょうか。 SQLのイメージは select * from [インスタンスA].[db01].[dbo].[Table1] tbl1 join [インスタンスB].[db02].[dbo].[Table2] tbl2 on tbl1.id=tbl2.id という感じです(もちろん動作しませんが) インスタンスAとインスタンスBは同一マシンにあり、SQLServer2008SP1とします。 開発環境はVS2008SP1でSqlClient.SqlConnectionを使用して接続し、 SqlCommandにてSQLを作成し、実行するような形です。 どうかよろしくお願いいたします。

専門家に質問してみよう