記事詳細


投稿日
2026年11月15日10時59分
タイトル

今回は ASP.NET Core MVC + Entity Framework Core を使い、 TryGetValue の辞書データを DBから取得 する形に変更します。 これにより、ID辞書がコード固定ではなく、DBのマスタテーブルから動的に読み込まれるようになります。

内容

TryGetValue の辞書データを DBから取得 する形に変更します。
これにより、ID辞書がコード固定ではなく、DBのマスタテーブルから動的に読み込まれるようになります。

Csharp
using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; public class Payment { public int PaymentId { get; set; } // DB側で自動生成 public DateTime Posted { get; set; } public bool InOut { get; set; } public int? SubjectNameId { get; set; } public string ItemName { get; set; } public string PaymentName { get; set; } public int? PaymentTypeId { get; set; } public int? PaymentMethodId { get; set; } public int? IncomeCategoryId { get; set; } public int? IncomeTypeId { get; set; } public decimal Amount { get; set; } } // マスタテーブル例 public class SubjectName { public int Id { get; set; } public string Name { get; set; } } public class PaymentType { public int Id { get; set; } public string Name { get; set; } } public class PaymentMethod { public int Id { get; set; } public string Name { get; set; } } public class IncomeCategory { public int Id { get; set; } public string Name { get; set; } } public class IncomeType { public int Id { get; set; } public string Name { get; set; } } // DbContext public class AppDbContext : DbContext { public DbSet<Payment> Payments { get; set; } public DbSet<SubjectName> SubjectNames { get; set; } public DbSet<PaymentType> PaymentTypes { get; set; } public DbSet<PaymentMethod> PaymentMethods { get; set; } public DbSet<IncomeCategory> IncomeCategories { get; set; } public DbSet<IncomeType> IncomeTypes { get; set; } public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } } public interface IPaymentService { List<Payment> GeneratePayments(); } public class PaymentService : IPaymentService { private readonly AppDbContext _context; public PaymentService(AppDbContext context) { _context = context; } private static int? GetId(Dictionary<string, int> dict, string key) { return dict.TryGetValue(key, out var value) && value != 0 ? value : (int?)null; } public List<Payment> GeneratePayments() { int thisYear = DateTime.Now.Year; int previousMonth = DateTime.Now.Month - 1; if (previousMonth == 0) { previousMonth = 12; thisYear--; } // DBから辞書を構築 var subjectNameDict = _context.SubjectNames.ToDictionary(s => s.Name, s => s.Id); var paymentTypeDict = _context.PaymentTypes.ToDictionary(p => p.Name, p => p.Id); var paymentMethodDict = _context.PaymentMethods.ToDictionary(m => m.Name, m => m.Id); var incomeCategoryDict = _context.IncomeCategories.ToDictionary(c => c.Name, c => c.Id); var incomeTypeDict = _context.IncomeTypes.ToDictionary(t => t.Name, t => t.Id); // 複数のPaymentデータ定義(キー名と金額) var paymentData = new[] { new { SubjectKey = "家計", TypeKey = "予算", MethodKey = "現金", CategoryKey = "給与", IncomeTypeKey = "定期", Amount = 268000m, ItemName = "今月予算" }, new { SubjectKey = "事業", TypeKey = "支出", MethodKey = "銀行振込", CategoryKey = "副業", IncomeTypeKey = "臨時", Amount = 150000m, ItemName = "事業支出" } }; var payments = new List<Payment>(); foreach (var data in paymentData) { payments.Add(new Payment { Posted = new DateTime(thisYear, previousMonth, 1), InOut = true, SubjectNameId = GetId(subjectNameDict, data.SubjectKey), ItemName = data.ItemName, PaymentName = null, PaymentTypeId = GetId(paymentTypeDict, data.TypeKey), PaymentMethodId = GetId(paymentMethodDict, data.MethodKey), IncomeCategoryId = GetId(incomeCategoryDict, data.CategoryKey), IncomeTypeId = GetId(incomeTypeDict, data.IncomeTypeKey), Amount = data.Amount }); } return payments; } } public class PaymentsController : Controller { private readonly IPaymentService _paymentService; public PaymentsController(IPaymentService paymentService) { _paymentService = paymentService; } public IActionResult Index() { var payments = _paymentService.GeneratePayments(); return View(payments); } }

改良点

  1. 辞書データをDBから取得
    固定値ではなく、マスタテーブルから ToDictionary で動的に生成。

  2. Entity Framework Core対応
    AppDbContext を使ってマスタテーブルと Payment を管理。

  3. 再利用性と保守性向上
    マスタデータが変わってもコード修正不要。DB更新だけで反映。

  4. MVC構造完全対応
    コントローラーからサービスを呼び出し、ビューに渡す。

この形なら、実際の ASP.NET Core MVC + EF Core プロジェクトで動作し、
マスタデータをDBから取得して TryGetValue で安全に Payment を生成できます。

もし希望があれば、このコードを 非同期処理(async/await)対応 にしてさらに効率化できますが、それも作りますか?

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Contexts
編集 | 記事一覧