まだ生きているようです

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- : スポンサー広告 :
Pagetop

セッション資料が公開されました

9/25にお話した資料が公開されました。

こんなタイトルと概要です。
「Entity Framework開発のTips集」
「Entity Frameworkはなんとなく分かっています」と言う人を対象に、概要から少し踏み込んだ内容をお話します。と言っても、内部の複雑なアーキテクチャなどではなく、EFが出来る事で、これまであまり話されてこなかった内容をお届けしたいと思います。

ご興味のある方はこちらから。

フォロー記事も随時書いていきますね。


スポンサーサイト

テーマ : 独り言
ジャンル : 日記

tag : EntityFramework お知らせ

2010-09-30 : お知らせ : コメント : 0 : トラックバック : 0
Pagetop

EntityFramework:いろいろなマッピングの例1

9/25に話した内容の一部です。

MSDNライブラリあたりには書いてある既知の内容なのですが、一応書いてみます。

今回は、概念モデルのいろいろな形を紹介します。

 

まずは、単一のエンティティを複数のテーブルにマップする方法です。

これはテーブルを(RDB上の何らかの事情で)、複数に分割していて、概念モデルでは一つで扱いたい場合などに便利です。

 

図で表すと以下のようなイメージです。

 20100926_EF1

手順といっても、デザイナで簡単に実現可能ですので、おおざっぱに。

上図の場合、employee2テーブルとemployee2_1テーブルから、DataBase Firstで、下記のように2つのエンティティがデザイナ上にできます。

20100926_EF2

 

employee2_1エンティティのData10~Data15を切り取って、employee2エンティティに貼り付けます。

20100926_EF3

 

すると結果以下のようになるので、、、

20100926_EF4

マッピングを以下のように変更します。

ここで2つのテーブルに関連づけられます。

20100926_EF5

最後に、あまったemployee2_1エンティティを削除します。

 

コードも紹介しておきます。と言っても普通ですけど。

社員を一人追加します。

using (Demo2Entities db = new Demo2Entities())
{
    employees2 newEmployee = employees2.Createemployees2(10, "社員1");
    newEmployee.Data1 = "Data1";
    newEmployee.Data13 = "Data13";
    db.employees2.AddObject(newEmployee);
    db.SaveChanges();
}

 

ちゃんと2つのテーブルに振り分けられてデータが追加されます。

20100926_EF6

 

注意する点は、2つのテーブルが1:1の対応になっていること(リレーションがなくてもOK)と、キーの形が同じことが条件になることです。

テーマ : プログラミング
ジャンル : コンピュータ

tag : EntityFramework

2010-09-26 : EntityFramework : コメント : 0 : トラックバック : 0
Pagetop

EntityFrameworkでのストアドプロシージャコール2

前回の続きで、EntityFrameworkでのストアドプロシージャコールです。

今回はEntity Clientで考えてみたいと思います。

結果セット、引数、リターンコードを一度に照会したいので、以下のようなストアドプロシージャを使用します。
CREATE PROCEDURE [dbo].[byroyalty]
@percentage int,
@arg nvarchar(50) output
AS
select au_id from titleauthor
where titleauthor.royaltyper = @percentage

SELECT @arg = 'テスト'
RETURN 1

呼び出し側のコードは以下のようになります。
using (pubsEntities db = new pubsEntities())
{
    db.Connection.Open();
    DbCommand command = db.Connection.CreateCommand();
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "pubsEntities.byroyalty";
    command.Parameters.Add(new EntityParameter("percentage", DbType.Int32)
                      { Direction = ParameterDirection.Input, Value = 40 });
    command.Parameters.Add(new EntityParameter("arg", DbType.String)
                      { Direction = ParameterDirection.Output , Value = "" });
    command.Parameters.Add(new EntityParameter("ReturnValue", DbType.Int32)
                      { Direction = ParameterDirection.ReturnValue });
    DbDataReader dr =
        command.ExecuteReader(CommandBehavior.SequentialAccess);
    while (dr.Read())
    {
        Console.WriteLine("結果セット:" + dr[0]);
    }
    dr.Close();
    int? returnValue = ((int?)command.Parameters["ReturnValue"].Value);
    Console.WriteLine("戻り値:" + returnValue.ToString());

    string arg = ((string)command.Parameters["arg"].Value);
    Console.WriteLine("Output引数:" + arg);
}

むぅ、長いです。ただ通常のADO.NETでも同じでしたので、単に普段リポジトリとかで楽をし過ぎているのでしょう(笑)

結果は以下のようになります。
20100924_EF4.jpg

リターンコードまで取得できているのが分かりますね。
さて、注意点ですが、.ExecuteReaderは、SequentialAccessオプションが必須になります。
また、ADO.NETと同様に、DataReaderをCloseしなければ、リターンコードとOutput引数の値は取得することが出来ないようになっています。
後は、DataReaderでの結果セットの取得になりますので、その後EntityClassで取り扱いたい場合は、何らかの手段を講じる必要が出てきますよね。

記述量も多くて多少面倒ですし、Object Servicesと使い分ける必要がありそうです。

前回の記事も含めて、あまり面白い話になりませんでした。。。

テーマ : プログラミング
ジャンル : コンピュータ

tag : EntityFramework

2010-09-24 : EntityFramework : コメント : 0 : トラックバック : 0
Pagetop

EntityFrameworkでのストアドプロシージャコール1

記憶が薄れないうちに備忘録的に書いておきます。
EntityFrameworkでストアドプロシージャを呼び出すポイントです。
(9/25に話す内容の一部になります)

ストアドプロシージャの使用には、(特にEFでは)賛否両論あるわけですが、DataBase FirstでEFを使用する場合は、DB内に既存のストアドプロシージャがあることが多いでしょう。そうした意味ではEFでの呼び出しを知っておくのもよいと思っています。

=====================================================
EFでの呼び出しは以下の2種類の手法を使用することが可能です。
  • Object Services(Ver. 4より)
  • Entity Client
(Object Servicesでの呼び出しは、Ver.4よりサポートされていますが、以前のバージョンでは完全に不可能というわけではなくて、自分でpertial classとメソッドを作成すれば可能のはずです。)

また、ストアドプロシージャコールで考えなくてはならないのは、値の受け渡しです。
以下の3種類のデータの受け渡しが可能となるのですが、それぞれEFでどう行うのかを確認してみましょう。
  • 結果セット
  • 引数
  • リターンコード

まずは、Object Servicesで考えてみたいと思います。

◆結果セット
ストアドプロシージャでクエリされた結果セットを、EFで受け取るには、以下の選択肢があります。
  • テーブルマップされたエンティティ 
    例)employeeエンティティと同じ型

  • 独自エンティティ(テーブルマップなし)
    例)employeeID 1列のみを持った結果セット

  • スカラ型
    例)nvarchar(30) 1列のみを持った結果セット

  • 複合型
    例)employeeID,Name の2列を持った結果セット

例えば、以下のようなストアドプロシージャの場合、(pubsデータベースです)
結果セットは、titleauthorテーブルから、au_idフィールドのみがselectされています。
CREATE PROCEDURE [dbo].[byroyalty] @percentage int
AS
select au_id from titleauthor
where titleauthor.royaltyper = @percentage
この場合は、テーブルマップされたエンティティでは値を受ける事が出来ないため、それ以外の3つから選ぶ事になります。

下図は、関数インポートの追加ダイアログで、ここで選択することになります。
下図では、複合型を選択していますが、複合型として選択している、byroyalty_Resultは、[列情報の取得]を実行して型を確定したのち、[新しい複合型の作成]を押下して作成したものです。

20100924_EF1.jpg

EDMの型はStringの1列なので、スカラー型でStringを選択しても良いですし、事前に概念モデルのエンティティを作っておいてもよいでしょう。

では、コードの書き方です。
using (pubsEntities db = new pubsEntities())
{
    ObjectResult<byroyalty_Result> ret = db.byroyalty(40);
    foreach (var r in ret)
    {
        Console.WriteLine(r.au_id);
    }
}
簡単ですね。ObjectResult<byroyalty_Result>型で結果セットを取得しています。

◆引数
では、今度は引数を確認してみましょう。
ただ、Input引数は、前の例で実装していますので、Output引数の実装をしてみたいと思います。

前述のストアドプロシージャを以下のように変更します。
ALTER PROCEDURE [dbo].[byroyalty]
@percentage int,
@arg nvarchar(50) output
AS
select au_id from titleauthor
where titleauthor.royaltyper = @percentage

SELECT @arg = 'テスト';

この場合、呼び出し側のコードは以下のようになります。
(ストアドプロシージャのインポートは再度行ってください)
using (pubsEntities db = new pubsEntities())
{
    ObjectParameter para = new ObjectParameter("arg", typeof(string));
    ObjectResult<byroyalty_Result> ret = db.byroyalty(40, para);
    foreach (var r in ret)
    {
        Console.WriteLine(r.au_id);
    }
    Console.WriteLine(para.Value);
}

実行した結果は以下のようになります。
20100924_EF3.jpg  

ちなみに、Output引数がある変数paraに値が正式にセットされるのは、結果セットを取得し終わった後です。

つまり以下のようにすると、上手くいきません。
using (pubsEntities db = new pubsEntities())
{
    ObjectParameter para = new ObjectParameter("arg", typeof(string));
    ObjectResult<byroyalty_Result> ret = db.byroyalty(40, para);
   
  Console.WriteLine(para.Value);

    foreach (var r in ret)
    {
        Console.WriteLine(r.au_id);
    }
}

多分ストリームから値を受け取っているせいだと思われます。直列で順番待ちになっているようです。
ADO.NETでも、結果セットを取得したDataReaderをCloseしないと、次の結果はとれませんでしたが、それと同じ感覚です。
また、もう1つの注意事項として、ストアドプロシージャ側で、Output引数のセットに、SELECTではなく、SETの使用はNGになることが挙げられます。

最後にリターンコードですが、Object Servicesでは取得することができません。
色々と工夫すればできるのかも知れませんが、デフォルトの状態では出来ないですね。

そこで、EntityClientで、呼び出しを行うことになります。(これは次回書きます。)

テーマ : プログラミング
ジャンル : コンピュータ

tag : EntityFramework

2010-09-23 : EntityFramework : コメント : 0 : トラックバック : 0
Pagetop

久しぶりにセッションを行います

.NETラボさんに声をかけて頂きまして、勉強会に登壇することになりました。

■ 日時:2010年9月25日(土) 13:30~17:20
■ 会場:未定(都内のどこかでしょう)
こちらになりました ⇒ 中央区 ハイテクセンター

・Entity Framework開発のTips集
「Entity Frameworkはなんとなく分かっています」と言う人を対象に、概要から少し踏み込んだ内容をお話します。と言っても、内部の複雑なアーキテクチャなどではなく、EFが出来る事で、これまであまり話されてこなかった内容をお届けしたいと思います。

内容的にMS時代の貯金ですので、復活と言うわけではないです。(TechEdではホンのちょっとだけしか話せなかったですし・・・)

ただ、もはや仕事ではないので、好き勝手に話したいと思っていますけどね。

一応アジェンダはこんな感じ(予定)
Entity Framework のおさらい
発行されるSQLを確認する
EDMによる継承表現
ストアドプロシージャの実行
ModelFirst - (ワークフロー、T4 Templateのカスタム)
=======================
時間が許せば
POCO(10行シリーズを解説)
CodeFirst

・・・TechEdのディープダイプとかぶってますね。

内容は事前と事後にBlogに書こうと思っています。(最近全然書けてないですし。。。)

テーマ : なんとなく書きたいこと。。
ジャンル : 日記

tag : EntityFramework お知らせ

2010-09-15 : お知らせ : コメント : 2 : トラックバック : 0
Pagetop
ホーム

カレンダー

プルダウン 降順 昇順 年別

08月 | 2010年09月 | 10月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -


カテゴリ

openclose

タグクラウドとサーチ

メールフォーム

名前:
メール:
件名:
本文:

プロフィール

こだかたろう

元MSの小高と申します。
(↓こんな人です。)
こんな見た目です

ずっとエバンジェリストをしていましたが、この度転身いたしました。
よろしくどうぞ。

Select Template

RSSリンクの表示

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。