http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4co …
こちらを参考にして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の方法を取るのですが…。
No.1ベストアンサー
- 回答日時:
自分も似たような案件を考えており、私見を述べさせてもらいます。
。結論から言いますと、おっしゃる中間の方法がベストかと思います。
・データコンテキストクラスは意外と軽い
以前のDataSetに比べると、テーブルベースの属性が単純化されている関係で、オブジェクトサイズは半分以下になっています。
→以前ならリレーション取った10テーブルくらいでDataSetを分割していましたが、倍くらい収容してもさほどパフォーマンスは悪くならない。
・Connectionは共用できる
→1つでいい
・LINQ for Entity Frameworkでは、JoinやGroup Joinで容易にリレーションを再構築できる。
→常時緊密にリレーショナルなオブジェクトを生成しないものであれば、関連エンティティを複数のコンテキストに分割しても、上位DALのロジックはそれほど複雑化しない。ただし、過度に分割するのは禁物。
ということで、自分は
・Connection定義は1個を複数データコンテキストで使い回す
・リレーション系統を整理して、相互アクセス頻度の少ない「節」で切断し、データコンテキストを分ける。
データコンテキスト内は保守性や一覧性もあるので、20~25テーブル以下
あたりが一番スッキリするのではないかと思います。
1コンテキストにどの程度のテーブルが許容できるかは、リレーションと各テーブル対応クラスの複雑さによるので、何とも言えませんが。。100テーブルだと、保守性も悪いかと。
回答ありがとうございます。
・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を作成するということもありえますが、パフォーマンスと使い勝手を考慮する必要がありそうですね。
No.2
- 回答日時:
このレベルでパフォーマンス考えたことないんですが。
コンテキストを分けたとき、複数のコンテキストにまたがる問い合わせを書いた場合にプログラムはJoin等を使ってすっきり書けても、実際のDBのへの問い合わせが複数回になってしまったり、本来絞り込んでとりだしたいデータが絞り込めない状態でメモリ上に載ってそこから絞り込みの操作がはいったり、といったことはないのでしょうか?
そのあたりも考慮する必要があるのかな、と思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Excel(エクセル) ExcelデータをWebページに保存した場合の名前定義 1 2023/08/01 15:38
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- 高校 合成関数の定義域につきまして 1 2022/05/18 17:26
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- その他(芸能人・有名人) 私の推しが「ファンは恋愛対象になりますか?」と言う質問に対し「ファンの定義による」とだけ回答しました 5 2022/07/17 19:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【ACCESS】リレーションを組ん...
-
ACCESSテーブルを RecordSet以...
-
Windows formアプリで データグ...
-
SQL文(テーブル項目名が特殊文...
-
select文の戻り値を変数に格納...
-
ASPとAccessとの接続について
-
テーブルというグローバル変数
-
DataGridViewで編集した内容を...
-
DBの読み込み順について
-
VBとACCESSを接続したい
-
Perlで変数内の日本語が文字コ...
-
外部キーのリレーションが設定...
-
金額の割り振り方について(A...
-
【Excel VBA】指定行以降をクリ...
-
ExcelVBAを使って、値...
-
count(*)で取得した値をJAVAの...
-
特定のセルが空白だったら、そ...
-
VBAでActiveDirectoryのユーザ...
-
i=cells(Rows.Count, 1)とi=cel...
-
”戻り値”が変化したときに、マ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL文(テーブル項目名が特殊文...
-
select文の戻り値を変数に格納...
-
【ACCESS】リレーションを組ん...
-
ACCESSテーブルを RecordSet以...
-
VBとACCESSを接続したい
-
テーブルというグローバル変数
-
DBの読み込み順について
-
access コンボボックス初期表示...
-
accessのフォームを使ってテー...
-
DataGridViewで編集した内容を...
-
外部キーのリレーションが設定...
-
HTML&CSS Javascriptによる動...
-
ASP(VBScript)で自動連番
-
Perlで変数内の日本語が文字コ...
-
EF(コードファースト)のコン...
-
ASP.NET:複数結合テーブルのデ...
-
フラッシュの画像を合わせるパ...
-
テーブルへのデータ投入について。
-
教えてアクセス2007!「在...
-
ExcelVBAを使って、値...
おすすめ情報