teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/12/18 03:01

投稿

退会済みユーザー
answer CHANGED
@@ -1,1 +1,45 @@
1
- .tt ファイルの下の複数の .cs ファイルに必要なクラスが定義されているはずです。開いて中身を見てください。それらを使って db へのアクセス、操作ができるはずです。
1
+ .tt ファイルの下の複数の .cs ファイルに必要なクラスが定義されているはずです。開いて中身を見てください。それらを使って db へのアクセス、操作ができるはずです。
2
+
3
+ **【2017/12/18 12:00 追記】**
4
+
5
+ 下の 2017/12/18 11:53 の私のコメントで、「コメント欄に書ききれないので回答欄に追記します」と書いた件です。
6
+
7
+ 自分の環境に限った話ですが、VS2010 + EF4 の場合、自動生成されるのは .edmx ファイルと .Designer.cs ファイルの 2 つのみで、.Designer.cs ファイルの中に ObjectContext クラスを継承したコンテキストクラスと、テーブルを表すモデルクラスがすべて生成されます。(注1)
8
+
9
+ 一方、VS2015 + EF6 の場合、.edmx ファイル、.Designer.cs ファイル、複数の .tt ファイル(T4 テキストテンプレート)とそれらから生成される複数の .cs ファイル(DbContext クラスを継承したコンテキストクラスとテーブルを表す複数のモデルクラス)が自動生成されます。.Designer.cs ファイルも生成されますが中身は空(コメント行のみ)です。
10
+
11
+ 質問者さんのケースでは、前者と同等な環境で作った既存の EDM があったが、DB にテーブルが追加されたので、後者と同等な環境で EDM を作り直したということだと想像してます。(質問に書いてある結果から想像は当たっているように思います)
12
+
13
+ ObjectContext クラスと DbContext クラスにはいろいろ違いがあるので、当然、それらを使用するプログラムのコードも異なってきます。互換性はないです。(例えば、ASP.NET MVC アプリで Visual Studio のスキャフォールディング機能を使って Controller / View を自動生成すると分かると思います)
14
+
15
+ 今回の問題は、既存の EDM を作った環境とそれを作り直した環境が異なり、既存のコードとは互換性のないコンテキストクラスとモデルクラスが作られてしまったということだと思います。
16
+
17
+ という訳で、解決策としては既存の EDM を作った環境でテーブルの追加に対応する EDM を作り直すということになると思います。(注2)
18
+
19
+ ただし、ちょっとわからないのが、
20
+
21
+ > EDM を作り直す前のディレクトリの中で、Designer.csと同じディレクトリにあるモデルクラスは、自分でソースコードを追加(DB保存やデータをList型で取得などのメソッドを記述)しています。こちらもEDMを作り直した時に、全て削除されてしまいます。
22
+
23
+ という点です。
24
+
25
+ 最初は、自動生成された .Designer.cs ファイルに自分でソースを記述していたものが、.Designer.cs ファイルが再生成された際に消えてしまったと思っていたのですが・・・
26
+
27
+ そうではなくて別の場所に別のソースファイルを置いてそこに記述したのだとすると、それは何故だかは分かりません。
28
+
29
+ 実際に以下の記事のように別のソースファイルでデータアノテーション属性を付与するようなことは多々あって、そのファイルが EDM を作り直したときに消えてしまうということはないはずなのですが。
30
+
31
+ EDM にデータアノテーション属性を付与
32
+ [http://surferonwww.info/BlogEngine/post/2017/05/21/how-to-add-dataannotation-attributes-to-edm-generated-by-visual-studio.aspx](http://surferonwww.info/BlogEngine/post/2017/05/21/how-to-add-dataannotation-attributes-to-edm-generated-by-visual-studio.aspx)
33
+
34
+
35
+
36
+ (注1)EF4 でも DbContext クラスを継承したコンテキストクラスを生成する方法はあるそうです。未検証、未確認ですが。
37
+
38
+ EntityFramework4のDBファーストでDbContextのコードを生成
39
+ [http://aoki1210.hatenablog.jp/entry/20130519/p1](http://aoki1210.hatenablog.jp/entry/20130519/p1)
40
+
41
+ (注2)VS2015 + EF6 で作った .Designer.cs ファイルのコメント(コードはありませんコメントのみです)に、
42
+
43
+ "レガシ コード生成を有効にするには、'コード生成方法' デザイナープロパティの値を 'レガシ ObjectContext' に変更します。このプロパティは、デザイナーでモデルが開かれている場合に [プロパティ] ウィンドウで使用できます。"
44
+
45
+ ・・・という記述があります。自分の環境では T4 固定になっていて変更できませんが、何らかの方法があるのかも。