ページ

2012年8月6日月曜日

◆Entity Frameworkで自己追跡エンティティを使う(纏め)

MTG Blog: ◆ADO.NET Entity Frameworkに入門してみるで試行錯誤しながら自己追跡エンティティを使ってみたのだが、再度読み直したら判りづらかったのでもう一度纏めてみる。
(DataプロジェクトとWebプロジェクトは分割しないほうが判りやすいのかもしれない)

  1. 新規に「Silverlightアプリケーション」を作成する。(AddressBook)
    imageimage

    2つのプロジェクトができる。
    image
  2. プロジェクトの追加で「AddressBook.Data」プロジェクト(クラスライブラリ)を追加する。(追加されたClass1.csは削除)
    image
  3. 「AddressBook.Data」プロジェクトに「ADO.NET Entity Dta Model」を追加。(Model1.edms)
    image
    image

    データ接続は前回作成した「AddressBook」データベースを使用する。
    image
  4. Model1.edmxを開き、デザイナ画面の背景をクリックし「AddressBookModel」のプロパティを表示。
    image
  5. プロパティ画面で「コード生成方法」に「なし」を指定する。
    image
  6. デザイナ画面の背景を右クリックし、コンテキストメニューから「コード生成項目の追加」を選択。
    image
  7. 「新しい項目の追加」画面で、「ADO.NET Self-Tracking Entity ジェネレーター」を選択する。
    image
  8. 「ソリューションエクスプローラ―」で「ソリューション」を右クリックして「AddressBook.Entity」プロジェクトを追加する。(Silverlightクラスライブラリプロジェクト) 「Class1.cs」は削除
    image
  9. 「ソリューションエクスプローラ―」で「AddressBook.Entity」プロジェクトを右クリックして「追加」「既存の項目」を選択。
    image
  10. 「AddressBook.Data」プロジェクトの「Model1.tt」を「リンクとして追加」
    image
  11. 「AddressBook.Entity」プロジェクトのプロパティで「既定の名前空間」を「AddressBook.Data」に変更。
    image
  12. 「AddressBook.Entity」プロジェクトに「参照の追加」で「System.Runtime.Serialization」を追加。
    image
  13. 「ソリューションエクスプローラ―」で「AddressBook.Web」プロジェクトに「AddressBook.Data」プロジェクトへの参照を追加。
    image
    image
  14. 「ソリューションエクスプローラ―」で「AddressBook.Web」に「参照の追加」
    で「System.Data.Entity」を追加する。
    image
    image
  15. 「ソリューションエクスプローラ―」で「AddressBook.Web」プロジェクトを右クリックして「新しい項目の追加」「Silverlight対応WCFサービス」を追加する。(AddressBookService)
    image
  16. 「AddressBook.Service.cs」に以下のメソッドを追加。
    AddressBook.Service.cs
    1. using System;
    2. using System.Linq;
    3. using System.Runtime.Serialization;
    4. using System.ServiceModel;
    5. using System.ServiceModel.Activation;
    6. using System.Collections.Generic;
    7. using AddressBook.Data;
    8.  
    9. namespace AddressBook.Web
    10. {
    11.     [ServiceContract(Namespace = "")]
    12.     [SilverlightFaultBehavior]
    13.     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    14.     public class AddressBookService
    15.     {
    16.         [OperationContract]
    17.         public List<Entry> GetEntries()
    18.         {
    19.             using (var container = new AddressBookEntities())
    20.             {
    21.                 // Entry
    22.                 return container.Entries.ToList<Entry>();
    23.             }
    24.         }
    25.  
    26.         // UpdateEntries
    27.         // OperationContract
    28.         [OperationContract]
    29.         public bool UpdateEntries(IEnumerable<Entry> entries)
    30.         {
    31.             using (var container = new AddressBookEntities())
    32.             {
    33.                 try
    34.                 {
    35.                     // ApplyChanges
    36.                     foreach (var entry in entries)
    37.                     {
    38.                         container.Entries.ApplyChanges(entry);
    39.                     }
    40.  
    41.                     // SaveChanges
    42.                     container.SaveChanges();
    43.                     return true;
    44.                 }
    45.                 catch (System.Data.OptimisticConcurrencyException ex)
    46.                 {
    47.                     return false;
    48.                 }
    49.             }
    50.         }
    51.     }
    52. }
  17. 「AddressBook」プロジェクトの「参照の追加」にて「AddressBook.Entity」プロジェクトを参照追加する。
  18. 「AddressBook」プロジェクトの「MainPage.xaml」に「DataGrid」コントロールを追加。
    image
    XAMLに以下が追加される。
    image
  19. 「DataGrid」のXAMLソースを以下に置き換える。
    MainPage.xaml
    1.         <sdk:DataGrid AutoGenerateColumns="False" Height="237"     HorizontalAlignment="Left" Margin="8,12,0,0" Name="dataGrid1"     VerticalAlignment="Top" Width="376" ItemsSource="{Binding}" Grid.Column="1">
    2.         <sdk:DataGrid.Columns>
    3.                    <sdk:DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" />
    4.                    <sdk:DataGridTextColumn Binding="{Binding Path=TelNo}" Header="TelNo" />
    5.                    <sdk:DataGridTextColumn Binding="{Binding Path=MailAddress}" Header="MailAddress" />
    6.                    <sdk:DataGridTextColumn Binding="{Binding Path=Age}" Header="Age" />
    7.         </sdk:DataGrid.Columns>
    8.     </sdk:DataGrid>
    9.     <Button Content="Load" Height="23" HorizontalAlignment="Left" Margin="59,265,0,0" Name="loadButton" VerticalAlignment="Top" Width="75" Grid.Column="1" />
    10.     <Button Content="Save" Height="23" HorizontalAlignment="Left" Margin="152,265,0,0" Name="saveButton" VerticalAlignment="Top" Width="75" Grid.Column="1" />


  20. 「F6キー」を押して一旦ビルド
  21. 「AddressBook」プロジェクトの「参照設定」から「サービス参照の追加」をクリック。
    image
  22. 「サービス参照の追加」画面で「探索」ボタンをクリック。
    image
  23. サービスが見つかったら、「名前空間」に「AddressBookServiceReference」を指定して「OK」
    image
  24. 「MainPage.xaml.cs」のイベントハンドラーを以下の通り編集。
    MainPage.xaml
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using System.Windows;
    6. using System.Windows.Controls;
    7. using System.Windows.Documents;
    8. using System.Windows.Input;
    9. using System.Windows.Media;
    10. using System.Windows.Media.Animation;
    11. using System.Windows.Shapes;
    12. using MyAddressBook.Data;
    13.  
    14. namespace MyAddressBook
    15. {
    16.     public partial class MainPage : UserControl
    17.     {
    18.         MyAddressBookServiceReference.MyAddressBookServiceClient service;
    19.  
    20.         public MainPage()
    21.         {
    22.             InitializeComponent();
    23.         }
    24.  
    25.         private void UserControl_Loaded(object sender, RoutedEventArgs e)
    26.         {
    27.             service = new MyAddressBookServiceReference.MyAddressBookServiceClient();
    28.         }
    29.  
    30.         private void loadButton_Click(object sender, RoutedEventArgs e)
    31.         {
    32.             service.GetEntriesCompleted += (send, ee) => dataGrid1.ItemsSource = ee.Result;
    33.             service.GetEntriesAsync();
    34.         }
    35.  
    36.         private void saveButton_Click(object sender, RoutedEventArgs e)
    37.         {
    38.             var entries = dataGrid1.ItemsSource.Cast<Entry>();
    39.             service.UpdateEntriesCompleted += (send, ee) => MessageBox.Show("Save " + (ee.Result ? "Success" : "Failure"));
    40.             service.UpdateEntriesAsync(new System.Collections.ObjectModel.ObservableCollection<Entry>(entries));
    41.         }
    42.     }
    43. }
  25. 「AddressBook.Web」プロジェクトと「AddressBook.Data」プロジェクトを分割した関係上、接続文字列が「AddressBook.Data」プロジェクトの「App.Config」に定義されているので、「AddressBook.Web」プロジェクトの「Web.Config」に移動する。
    image
  26. 「F5キー」で実行し、「Load」「Save」ができればOK

0 件のコメント:

コメントを投稿

私が最近チェックした記事