FreeSQLは、多様なデータベースをサポートする強力で柔軟な.NET ORMフレームワークです。本記事では、FreeSQLを使用してOceanBaseデータベースのMySQLモードに接続する方法について説明します。
前提条件
- .NET SDK 6.0以降のバージョンがインストール済みであること。
- Visual StudioまたはVS Codeがインストールされていること。
- OceanBaseデータベースがデプロイ済みで、MySQLモードのテナントが作成されていること。
手順
- 新しいプロジェクトを作成します。
- 必要なNuGetパッケージをインストールします。
- データベース接続を設定します。
- データモデルを作成します。
- データアクセス層を実装します。
- サンプルプログラムを実行します。
ステップ1:新しいプロジェクトを作成する
ターミナルを開き、以下のコマンドを実行して新しいコンソールアプリケーションを作成します。
dotnet new console -n FreeSQLOceanBaseDemo cd FreeSQLOceanBaseDemo
ステップ2:必要なNuGetパッケージをインストールする
FreeSQLと必要な依存パッケージをインストールします。
# ORMコアパッケージ dotnet add package FreeSQL dotnet add package FreeSql.Provider.MySqlConnector dotnet add package FreeSql.DbContext # 設定関連 dotnet add package Microsoft.Extensions.Configuration --version 8.0.0 dotnet add package Microsoft.Extensions.Configuration.FileExtensions --version 8.0.0 dotnet add package Microsoft.Extensions.Configuration.Json --version 8.0.0 # パスワード暗号化 dotnet add package BCrypt.Net-Next --version 4.0.3
ステップ3:データベース接続を設定する
appsettings.jsonファイルを作成し、データベース接続文字列を追加します。{ "ConnectionStrings": { "DefaultConnection": "Server=your_server;Port=2881;Database=your_database;Uid=your_username;Pwd=your_password;" } }プロジェクトファイル(
.csproj)を修正し、appsettings.jsonが出力ディレクトリにコピーされていることを確認します。<ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
ステップ4:データモデルを作成する
Modelsフォルダを作成し、User.csクラスを追加します。using FreeSql.DataAnnotations; using System; namespace FreeSQLOceanBaseDemo.Models; [Table(Name = "users")] public class User { [Column(IsPrimary = true, IsIdentity = true)] public int Id { get; set; } [Column(StringLength = 50, IsNullable = false)] public string Username { get; set; } [Column(StringLength = 100, IsNullable = false)] public string Email { get; set; } [Column(StringLength = 255, IsNullable = false)] public string PasswordHash { get; set; } [Column(ServerTime = DateTimeKind.Utc, CanUpdate = false)] public DateTime CreatedAt { get; set; } [Column(ServerTime = DateTimeKind.Utc)] public DateTime? UpdatedAt { get; set; } }
ステップ5:データアクセス層の実装
Dataフォルダを作成し、AppDbContext.csクラスを追加します:using FreeSql; using System.Data; using FreeSql.DatabaseModel; using FreeSQLOceanBaseDemo.Models; using Microsoft.Extensions.Configuration; using System; using System.IO; namespace FreeSQLOceanBaseDemo.Data; public class AppDbContext : DbContext { public DbSet Users { get; set; } private readonly IConfiguration _configuration; private static IFreeSql _fsql; public AppDbContext(IConfiguration configuration) { _configuration = configuration; if (_fsql == null) { _fsql = new FreeSqlBuilder() .UseConnectionString(DataType.MySql, _configuration.GetConnectionString("DefaultConnection")) .UseMonitorCommand(cmd => { Console.WriteLine($"SQL: {cmd.CommandText}"); if (cmd.Parameters != null) { foreach (IDataParameter param in cmd.Parameters) { Console.WriteLine($" -> {param.ParameterName}: {param.Value}"); } } }) .UseAutoSyncStructure(true) .Build(); _fsql.Aop.CurdBefore += (s, e) => { Console.WriteLine($"実行前: {e.Sql}"); }; _fsql.Aop.CurdAfter += (s, e) => { Console.WriteLine($"実行後、影響行数: {e.ElapsedMilliseconds}ms"); }; } } public IFreeSql GetFreeSql() { return _fsql; } }Repositoriesフォルダを作成し、UserRepository.csクラスを追加します:using FreeSql; using FreeSQLOceanBaseDemo.Models; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace FreeSQLOceanBaseDemo.Repositories; public class UserRepository { private readonly IFreeSql _fsql; public UserRepository(IFreeSql fsql) { _fsql = fsql; } public async Task<List<User>> GetAllUsersAsync() { return await _fsql.Select<User>().ToListAsync(); } public async Task<User> GetUserByIdAsync(int id) { return await _fsql.Select<User>().Where(u => u.Id == id).FirstAsync(); } public async Task<User> CreateUserAsync(User user) { user.CreatedAt = DateTime.UtcNow; await _fsql.Insert(user).ExecuteAffrowsAsync(); return user; } public async Task<bool> UpdateUserAsync(User user) { user.UpdatedAt = DateTime.UtcNow; var result = await _fsql.Update<User>() .SetSource(user) .ExecuteAffrowsAsync(); return result > 0; } public async Task<bool> DeleteUserAsync(int id) { var result = await _fsql.Delete<User>() .Where(u => u.Id == id) .ExecuteAffrowsAsync(); return result > 0; } }
ステップ6:メインプログラムの実装
Program.cs ファイルを修正します:
using FreeSQLOceanBaseDemo.Data;
using FreeSQLOceanBaseDemo.Models;
using FreeSQLOceanBaseDemo.Repositories;
using Microsoft.Extensions.Configuration;
using System;
using System.IO;
using System.Threading.Tasks;
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
var dbContext = new AppDbContext(configuration);
var userRepository = new UserRepository(dbContext.GetFreeSql());
var newUser = new User
{
Username = "testuser",
Email = "test@example.com",
PasswordHash = BCrypt.Net.BCrypt.HashPassword("your_secure_password")
};
try
{
var createdUser = await userRepository.CreateUserAsync(newUser);
Console.WriteLine($"User created with ID: {createdUser.Id}");
var user = await userRepository.GetUserByIdAsync(createdUser.Id);
if (user != null)
{
Console.WriteLine($"Retrieved user: {user.Username}, Email: {user.Email}");
user.Username = "updated_username";
var updated = await userRepository.UpdateUserAsync(user);
Console.WriteLine($"User updated: {updated}");
var users = await userRepository.GetAllUsersAsync();
Console.WriteLine($"Total users: {users.Count}");
var deleted = await userRepository.DeleteUserAsync(user.Id);
Console.WriteLine($"User deleted: {deleted}");
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
Console.WriteLine(ex.StackTrace);
}
プログラムの実行
appsettings.jsonのデータベース接続文字列が更新されていることを確認します。ターミナルで次のコマンドを実行します:
dotnet run