Entity Framework 6 からIBM Cloud Object Storage データに連携

この記事は、Entity Framework のcode-first アプローチを使って、IBM Cloud Object Storage に接続する方法を説明します。Entity Framework 6 は.NET 4.5 以上で利用可能です。



Entity Framework はobject-relational mapping フレームワークで、データをオブジェクトとして扱うために使われます。Visual Studio のADO.NET Entity Data Model ウィザードを実行するとEntity Model を作成できますが、このモデルファーストアプローチでは、データソースに変更があった場合やエンティティ操作をより制御したい場合は不都合があります。この記事では、CData ADO.NET Provider を使いコードファーストアプローチでIBM Cloud Object Storage にアクセスします。

  1. Visual Studio を起動し、新しいWindows Form アプリケーションを作成します。ここでは、.NET 4.5 のC# プロジェクトを使います。
  2. Visual Studio の [パッケージ マネージャー コンソール]から'Install-Package EntityFramework' コマンドを実行し、最新のEntity Framework をインストールします。
  3. プロジェクトのApp.config ファイルを修正して、IBM Cloud Object Storage Entity Framework 6 アセンブリおよびコネクションストリングへの参照を追加します。

    Register a New Instance of Cloud Object Storage

    If you do not already have Cloud Object Storage in your IBM Cloud account, follow the procedure below to install an instance of SQL Query in your account:

    1. Log in to your IBM Cloud account.
    2. Navigate to the page, choose a name for your instance and click Create. You will be redirected to the instance of Cloud Object Storage you just created.

    Connecting using OAuth Authentication

    There are certain connection properties you need to set before you can connect. You can obtain these as follows:

    API Key

    To connect with IBM Cloud Object Storage, you need an API Key. You can obtain this as follows:

    1. Log in to your IBM Cloud account.
    2. Navigate to the Platform API Keys page.
    3. On the middle-right corner click "Create an IBM Cloud API Key" to create a new API Key.
    4. In the pop-up window, specify the API Key name and click "Create". Note the API Key as you can never access it again from the dashboard.

    Cloud Object Storage CRN

    If you have multiple accounts, you will need to specify the CloudObjectStorageCRN explicitly. To find the appropriate value, you can:

    • Query the Services view. This will list your IBM Cloud Object Storage instances along with the CRN for each.
    • Locate the CRN directly in IBM Cloud. To do so, navigate to your IBM Cloud Dashboard. In the Resource List, Under Storage, select your Cloud Object Storage resource to get its CRN.

    Connecting to Data

    You can now set the following to connect to data:

    • InitiateOAuth: Set this to GETANDREFRESH. You can use InitiateOAuth to avoid repeating the OAuth exchange and manually setting the OAuthAccessToken.
    • ApiKey: Set this to your API key which was noted during setup.
    • CloudObjectStorageCRN (Optional): Set this to the cloud object storage CRN you want to work with. While the connector attempts to retrieve this automatically, specifying this explicitly is recommended if you have more than Cloud Object Storage account.

    When you connect, the connector completes the OAuth process.

    1. Extracts the access token and authenticates requests.
    2. Saves OAuth values in OAuthSettingsLocation to be persisted across connections.
    <configuration> ... <connectionStrings> <add name="IBMCloudObjectStorageContext" connectionString="Offline=False;ApiKey=myApiKey;CloudObjectStorageCRN=MyInstanceCRN;Region=myRegion;OAuthClientId=MyOAuthClientId;OAuthClientSecret=myOAuthClientSecret;" providerName="System.Data.CData.IBMCloudObjectStorage" /> </connectionStrings> <entityFramework> <providers> ... <provider invariantName="System.Data.CData.IBMCloudObjectStorage" type="System.Data.CData.IBMCloudObjectStorage.IBMCloudObjectStorageProviderServices, System.Data.CData.IBMCloudObjectStorage.Entities.EF6" /> </providers> <entityFramework> </configuration> </code>
  4. インストールディレクトリの[lib] > 4.0 サブフォルダにあるSystem.Data.CData.IBMCloudObjectStorage.Entities.EF6.dll を設定し、プロジェクトを作成してEntity Framework 6 を使うためのセットアップを完了します。
  5. この時点でプロジェクトを作成し、すべてが正しく動作していることを確認してください。これで、Entity Framework を使ってコーディングを開始できます。
  6. プロジェクトに新しい.cs ファイルを追加し、そこにクラスを追加します。これがデータベースのコンテキストとなり、DbContext クラスを拡張します。この例では、クラス名はIBMCloudObjectStorageContext です。以下のサンプルコードは、OnModelCreating メソッドをオーバーライドして次の変更を加えます:
    • PluralizingTableNameConvention をModelBuilder Conventions から削除。
    • MigrationHistory テーブルへのリクエストを削除。
    using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Entity.ModelConfiguration.Conventions; class IBMCloudObjectStorageContext :DbContext { public IBMCloudObjectStorageContext() { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // To remove the requests to the Migration History table Database.SetInitializer<IBMCloudObjectStorageContext>(null); // To remove the plural names modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } }
  7. もう一つ.cs ファイルを作成し、ファイル名を呼び出そうとしているIBM Cloud Object Storage のエンティティ、例えばObjects にします。このファイルでは、エンティティとエンティティ設定の両方を定義します。以下に例を示します。 using System.Data.Entity.ModelConfiguration; using System.ComponentModel.DataAnnotations.Schema; public class Objects { [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public System.String Id { get; set; } public System.String Key { get; set; } } public class ObjectsMap :EntityTypeConfiguration<Objects> { public ObjectsMap() { this.ToTable("Objects"); this.HasKey(Objects => Objects.Id); this.Property(Objects => Objects.Key); } }
  8. エンティティの作成が済んだので、コンテキストクラスにエンティティを追加します: public DbSet<Objects> Objects { set; get; }
  9. コンテキストとエンティティの作成が完了したら、別クラスでデータをクエリできます。例: IBMCloudObjectStorageContext context = new IBMCloudObjectStorageContext(); context.Configuration.UseDatabaseNullSemantics = true; var query = from line in context.Objects select line;
 
 
ダウンロード