開発者必見!OracleとVisual Studioで始めるコードファーストの世界

システム開発

データベースのテーブル作成や操作において、コードファーストアプローチの複雑さに悩んでいませんか?この記事では、Entity Frameworkを用いたデータベースとテーブルの生成からCRUD操作までの詳細なプロセスを解説しています。エンティティクラスの作成方法、マイグレーションの活用、そしてデータベース操作の基本的なテクニックを学ぶことで、開発の効率を大幅に向上させることができます。この情報が、データベースの扱いに苦労しているあなたに新たな視点を提供し、開発の課題解決に役立つでしょう。

コードファーストアプローチの概要

コードファーストアプローチは、Entity Frameworkでデータモデルをコードによって定義し、それに基づきデータベースを生成する方法です。この手法では、アプリケーションのコードから直接データベースを構築するため、開発者はデータベース構造を直感的にコントロールできます。また、エンティティクラス(POCO)を用いることで、データベースのテーブルやカラムを表現し、変更が容易になります。テスト駆動開発(TDD)や継続的インテグレーション(CI)にも適していますが、データベース設計の知識が必要で、大規模なデータベースには適用が難しい場合があります。このアプローチは、プロジェクトの効率性と品質の向上に貢献します。

開発環境の準備

当開発環境では、データベースとしてOracleを利用します。以下のツールが開発に必要です。

  1. Oracle Database: 主要なデータベースとしてOracle Database Express Edition(XE)を使用。無料で利用可能で、開発、デプロイ、配布が可能です。ダウンロードはこちらから。
  2. Visual Studio: Microsoftの統合開発環境。コード編集、デバッグ、バージョン管理に対応。無料のコミュニティエディションはこちらからダウンロード可能。

サンプルプログラム作成手順

  1. プロジェクトの作成サンプルとしてVisual Studio 2022でWindowsFormで「MygrationTest」で作成
  2. 必要なパッケージの追加NuGetパッケージで以下をインストールする 。
    ※Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Toolsは、同じバージョンにあわせておきます。異なる場合はマイグレーション時にエラーとなる可能性があるので注意

    1. Oracle.ManagedDataAccess.Core: .NET Coreや.NET 5/6/7アプリケーションでOracleデータベースに接続するためのODP.NETマネージドドライバ。
    2. Oracle.EntityFrameworkCore: Entity Framework CoreとOracleデータベースの統合を提供します。
    3. Microsoft.EntityFrameworkCore: Entity Framework Coreの基本機能を提供します。
    4. Microsoft.EntityFrameworkCore.Tools: Entity Framework Coreの追加ツールを提供します。
  3. モデルクラスの作成プロジェクトに「MyMode.cs」クラスを追加し、以下コードを記述
    using System.ComponentModel.DataAnnotations;
    
    namespace MigrationTest
    {
        public class MyModel
        {
            [Key]
            public int Id { get; set; }
    
            public string? Name { get; set; }
        }
    }
    
  4. DbContextクラスの作成プロジェクトに「MyDbContext.cs」クラスを追加し、以下コードを記述
    ※Oracleは21Cを利用しています。「XEPDB1」はインストールのデフォルトコンテナーです。
    ※User Id=MY21C、Password=MY21Cは自分の環境に合わせます。

    using Microsoft.EntityFrameworkCore;
    using MigrationTest;
    
    namespace MigrationTest
    {
        public class MyDbContext : DbContext
        {
            public DbSet<MyModel> MyModels { get; set; }
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                // 接続文字列を設定
                optionsBuilder.UseOracle(@"User Id=MY21C;Password=MY21C;Data Source=(XEPDB1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DESKTOP-OC26K7E)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XEPDB1))))");
            }
        }
    }
    
  5. マイグレーションの作成と適用パッケージマネジャーコンソールからAdd-Migraion、Update-databaseを行う。
    • Add-Migraion
    PM> Add-Migration sample
    Build started...
    Build succeeded.
    To undo this action, use Remove-Migration.
    

    実行するとMigraionsフォルダが作成され、その中に以下ファイルが作成されます。

    using Microsoft.EntityFrameworkCore.Migrations;
    
    #nullable disable
    
    namespace MigrationTest.Migrations
    {
        /// <inheritdoc />
        public partial class sample : Migration
        {
            /// <inheritdoc />
            protected override void Up(MigrationBuilder migrationBuilder)
            {
                migrationBuilder.CreateTable(
                    name: "MyModels",
                    columns: table => new
                    {
                        Id = table.Column<int>(type: "NUMBER(10)", nullable: false)
                            .Annotation("Oracle:Identity", "START WITH 1 INCREMENT BY 1"),
                        Name = table.Column<string>(type: "NVARCHAR2(2000)", nullable: true)
                    },
                    constraints: table =>
                    {
                        table.PrimaryKey("PK_MyModels", x => x.Id);
                    });
            }
    
            /// <inheritdoc />
            protected override void Down(MigrationBuilder migrationBuilder)
            {
                migrationBuilder.DropTable(
                    name: "MyModels");
            }
        }
    }
    
    • Update-database
    PM> Update-database
    Build started...
    Build succeeded.
    Applying migration '20231119003051_sample.
    Done.
    

    実行するとデータベースに更新が反映されます。 また、__FEMigraiontsHistroyテーブルが履歴テーブルとして自動で作成されます。

CRUD操作とデータの読み書き

Entity Frameworkを使用したCRUD(Create、Read、Update、Delete)操作は、データベースのデータを効率的に扱う基本的な方法です。これらの操作を理解し適切に使いこなすことで、データベース駆動型のアプリケーションの開発が容易になります。 以下サンプルは、WindowsFormにCRUDボタンを作成した例です。実行してテーブルの確認して問題なく実行されていることを確認します。

namespace MigrationTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private MyDbContext _context = new MyDbContext();

        // Create (追加)
        private void CreateButton_Click(object sender, EventArgs e)
        {
            var newEntity = new MyModel { Name = "テスト 太郎" };
            _context.MyModels.Add(newEntity);
            _context.SaveChanges();
        }

        // Read (読み取り)
        private void ReadButton_Click(object sender, EventArgs e)
        {
            var entity = _context.MyModels.FirstOrDefault();
            if (entity != null)
            {
                MessageBox.Show(entity.Name);
            }
        }

        // Update (更新)
        private void UpdateButton_Click(object sender, EventArgs e)
        {
            var entity = _context.MyModels.FirstOrDefault();
            if (entity != null)
            {
                entity.Name = "テスト 次郎";
                _context.SaveChanges();
            }
        }

        // Delete (削除)
        private void DeleteButton_Click(object sender, EventArgs e)
        {
            var entity = _context.MyModels.FirstOrDefault();
            if (entity != null)
            {
                _context.MyModels.Remove(entity);
                _context.SaveChanges();
            }
        }
    }
}

コミット・ロールバックのタイミング

コミットのタイミング

  • コミットは、SaveChanges() メソッドを呼び出すことで行われます。このメソッドは、行われたすべての変更(追加、更新、削除)をデータベースに永続化します。
  • 一連の変更を行った後、それらがすべて正しいと確認できた時点で SaveChanges() を呼び出すべきです。

ロールバックのタイミング

  • ロールバックは、例外が発生した場合や予期しないエラーが起きた時に自動的に行われます。SaveChanges() が正常に完了する前にエラーが発生した場合、行われた変更はデータベースに反映されません。
  • 手動でロールバックを制御するためには、トランザクションを使用することもできます。これにより、複数の SaveChanges() 呼び出しを一つのトランザクションとして管理し、エラーが発生した場合に全ての変更をロールバックできます。

オブジェクトリレーショナルマッピング(ORM)ラッパー

  1. Entity Framework (C#/.NET):
    • マイクロソフトによって開発された.NETのためのORMフレームワーク。
    • コードファースト、データベースファースト、モデルファーストのアプローチをサポート。
    • LINQ (Language Integrated Query) を使用して、C#のコードでデータベースクエリを記述可能。
  2. Hibernate (Java):
    • Javaのアプリケーションで広く使用されるORMツール。
    • アノテーションまたはXMLベースの設定を使用して、Javaオブジェクトとデータベーステーブルをマッピング。
    • HQL (Hibernate Query Language) またはCriteria Queryを使用してクエリを行う。
  3. Django ORM (Python):
    • Djangoウェブフレームワークに組み込まれているORM。
    • Pythonのクラスを使ってデータモデルを定義し、Djangoがデータベース操作を自動的に処理。
    • Djangoのモデルシステムは、クエリセットAPIを通じてリッチなデータベース操作を提供。
  4. Sequelize (Node.js):
    • Node.jsアプリケーション用のPromiseベースのORM。
    • MySQL、MariaDB、Postgres、SQLiteなど複数のデータベースをサポート。
    • JavaScriptのオブジェクトを使ってモデルを定義し、データベース操作を実行。
  5. ActiveRecord (Ruby on Rails):
    • Ruby on Railsフレームワークの一部として提供されるORM。
    • Rubyのクラスとメソッドを使ってデータベーステーブルとのマッピングを行う。
    • マイグレーション、関連付け、バリデーションなど、リッチな機能を提供。

コメント

タイトルとURLをコピーしました