さてと、仕事もひと段落したので、SQL Serverよりデータを取り出してみたいと思います。
早速、プロジェクトに、「ADO.NET Entity Data Model」を追加してみました。
ウィザードが表示され、
「データベースから生成」
「空のモデル」
とありますが、調査なので空のモデルを選択してみましょう。
Visual Studioよりファイルを開くと・・・
「Entity Data Modelデザイナーを使用すると、Entity Data Modelを表示してデザインできます。」
「新しいエンティティをモデルに作成するには、ツールボックスから項目をドラッグします。」
などと表示されています。
サーバーエクスプローラーから、テーブルをドラッグ&ドロップもできません。
ツールボックスから、エンティティを入れる事ができますが、私が目指している物とは
違いますね。 データベースからの生成が行いたいのです。
デザイナーで右クリック!!
データーベースからモデルを更新
モデルからデーターベースを生成
などという、魅力的なメニューを発見!!
早速、データーベースからモデルを生成してみましょう。
更新ウィザード画面が表示されました。
ここの接続先は、サーバーエクスプローラーの接続先が表示されているみたいです。
また、「新しい接続」ボタンを押せば、ここでも新規に接続先を作成できます。
では 早速。
エンティティ接続文字列が作成されました。
metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="Data Source=ServerName;Initial Catalog=DataBaseName;Integrated Security=True"
へぇ。今後はこれで管理して行くのですね。
残りはとりあえず、デフォルトで作成
次へ!!
ふむ。更新ウィザードはデータベースオブジェクトの選択などという画面が表示されました。
ここでは、テーブルやビューのオブジェクトを追加したり更新したり、削除したりするみたいです。
Linq to SQLでは、デザイナーからテーブルをオブジェクト削除して、テーブルを再ドラッグ&ドロップをしていたのですが、
Entity Frameworkでは、この更新ウィザードで管理するのですね。
メモメモ。 φ(..)
「生成されたオブジェクトの名前を複数化または単数かする」
どこかでこの話を聞いた気がするが、とりあえず忘れて。。。 デフォルトのままで完了します。
生成するデータベースは開発中の案件のDBを利用してみました。
テーブルとビューを全部選択して、、生成!!
(テーブル数150本ぐらいの規模)
ちょっと長めですが、しばらくすると完了しました。
ソースに追加されたファイルが、「Model1.edmx」 これが一番最初に追加したファイルで、
ダブルクリックすると、デザイナが開きます。
プロジェクトのPropertiesのDataSourcesに、Model1Conteiner.datasourceなんてファイルが
出来ちゃっています。
謎がまだ現れました。
さてと、調査してみますか。。。
まずは、Mode1.edmx
作りは、Linq to SQLと似ていますね。
Linq to SQLでは、DataContextから継承された、接続を関するクラスが生成されるのですが、
Entity Frameworkでは、ObjectContextから継承された、接続クラスが生成されています。(多分・・・だってまだ実行していないし)
その中には、プロパティが幾つかあって、
ObjectSet プロパティってリージョンがあります。
ObjectSet<>は、Linq to SQLで言う所のTable<>っぽいですね。
ふむふむ。
ということで、ObjectSetのクラス定義を見てみましょう。
public class ObjectSet : ObjectQuery, IObjectSet, IQueryable, IEnumerable, IQueryable, IEnumerable where TEntity : class
予想通りということと、 AddObjectやら、DeleteObjectなどがあります。
個人的な趣味から言うと、AddObjectってメソッドはくどいので後でラップしちゃうかも。。。
まぁ IQueryableもあるので、Table<>ですね。
AddToメソッドのregionがひどい・・・
コメント欄にに、非推奨のメソッドです。別のを使え と書いてあるのですが。
その通りで、きたない。。。
内容としては、テーブルにEntity一個をインサートするメソッドが、テーブル数生成されています。
うぅぅ。。。 互換の為にあるんでしょうね。 目が腐ります。 Addがあるのに、Deleteがないのも不満(何か違う?)
まぁ 見なかった事にしましょう。
おぉぉぉぉぉ 喜びましょう!! 良いものを見つけました。
次にテーブルのクラスがあるのですが、
Linq to SQL では、そのクラスの継承が、 INotifyPropertyChanging, INotifyPropertyChanged だけだったのですが、
今回はちゃんと、 EntityObject っていうクラスから継承されています。
これで、オブジェクトの特定が出来ますね。 よかった よかった (T_T)
で、一通り見渡した感じ、Linq to SQLをちょっと良くした感じのものになっていますね。
今日の電話当番が終わったので、この調査の続きは月曜日以降にします。
これは調べ甲斐があるかもしれませんね。
あっ、、、最初の目標であるデータが取り出せてないし・・・ それも月曜日以降ですね。