データベースのテーブル作成や操作において、コードファーストアプローチの複雑さに悩んでいませんか?この記事では、Entity Frameworkを用いたデータベースとテーブルの生成からCRUD操作までの詳細なプロセスを解説しています。エンティティクラスの作成方法、マイグレーションの活用、そしてデータベース操作の基本的なテクニックを学ぶことで、開発の効率を大幅に向上させることができます。この情報が、データベースの扱いに苦労しているあなたに新たな視点を提供し、開発の課題解決に役立つでしょう。
コードファーストアプローチの概要
コードファーストアプローチは、Entity Frameworkでデータモデルをコードによって定義し、それに基づきデータベースを生成する方法です。この手法では、アプリケーションのコードから直接データベースを構築するため、開発者はデータベース構造を直感的にコントロールできます。また、エンティティクラス(POCO)を用いることで、データベースのテーブルやカラムを表現し、変更が容易になります。テスト駆動開発(TDD)や継続的インテグレーション(CI)にも適していますが、データベース設計の知識が必要で、大規模なデータベースには適用が難しい場合があります。このアプローチは、プロジェクトの効率性と品質の向上に貢献します。
開発環境の準備
当開発環境では、データベースとしてOracleを利用します。以下のツールが開発に必要です。
- Oracle Database: 主要なデータベースとしてOracle Database Express Edition(XE)を使用。無料で利用可能で、開発、デプロイ、配布が可能です。ダウンロードはこちらから。
- Visual Studio: Microsoftの統合開発環境。コード編集、デバッグ、バージョン管理に対応。無料のコミュニティエディションはこちらからダウンロード可能。
サンプルプログラム作成手順
- プロジェクトの作成サンプルとしてVisual Studio 2022でWindowsFormで「MygrationTest」で作成
- 必要なパッケージの追加NuGetパッケージで以下をインストールする 。
※Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Toolsは、同じバージョンにあわせておきます。異なる場合はマイグレーション時にエラーとなる可能性があるので注意- Oracle.ManagedDataAccess.Core: .NET Coreや.NET 5/6/7アプリケーションでOracleデータベースに接続するためのODP.NETマネージドドライバ。
- Oracle.EntityFrameworkCore: Entity Framework CoreとOracleデータベースの統合を提供します。
- Microsoft.EntityFrameworkCore: Entity Framework Coreの基本機能を提供します。
- Microsoft.EntityFrameworkCore.Tools: Entity Framework Coreの追加ツールを提供します。
- モデルクラスの作成プロジェクトに「MyMode.cs」クラスを追加し、以下コードを記述
using System.ComponentModel.DataAnnotations; namespace MigrationTest { public class MyModel { [Key] public int Id { get; set; } public string? Name { get; set; } } }
- 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))))"); } } }
- マイグレーションの作成と適用パッケージマネジャーコンソールから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)ラッパー
- Entity Framework (C#/.NET):
- マイクロソフトによって開発された.NETのためのORMフレームワーク。
- コードファースト、データベースファースト、モデルファーストのアプローチをサポート。
- LINQ (Language Integrated Query) を使用して、C#のコードでデータベースクエリを記述可能。
- Hibernate (Java):
- Javaのアプリケーションで広く使用されるORMツール。
- アノテーションまたはXMLベースの設定を使用して、Javaオブジェクトとデータベーステーブルをマッピング。
- HQL (Hibernate Query Language) またはCriteria Queryを使用してクエリを行う。
- Django ORM (Python):
- Djangoウェブフレームワークに組み込まれているORM。
- Pythonのクラスを使ってデータモデルを定義し、Djangoがデータベース操作を自動的に処理。
- Djangoのモデルシステムは、クエリセットAPIを通じてリッチなデータベース操作を提供。
- Sequelize (Node.js):
- Node.jsアプリケーション用のPromiseベースのORM。
- MySQL、MariaDB、Postgres、SQLiteなど複数のデータベースをサポート。
- JavaScriptのオブジェクトを使ってモデルを定義し、データベース操作を実行。
- ActiveRecord (Ruby on Rails):
- Ruby on Railsフレームワークの一部として提供されるORM。
- Rubyのクラスとメソッドを使ってデータベーステーブルとのマッピングを行う。
- マイグレーション、関連付け、バリデーションなど、リッチな機能を提供。
コメント