【C#】属性(Data Annotations)でカラムの型や制約を定義する

Entity Framework Core では、エンティティクラスのプロパティに「属性(Data Annotations)」を付与することで、データベース側のテーブル定義(データ型、文字数、NULL制約など)を詳細に制御できます。

ここでは「従業員マスタ」を例に、文字列の長さ固定や、金額の精度、日付型の指定などを行う方法を解説します。

目次

実装サンプル:従業員マスタの定義

以下のコードでは、Employee クラスに対し、[Column][MaxLength] 属性を使用して、SQL Server や MySQL などのデータベース上で意図した型になるように設定しています。

Model.cs

using System;
using System.ComponentModel.DataAnnotations;       // [Required], [MaxLength] など
using System.ComponentModel.DataAnnotations.Schema; // [Column] など

public class Employee
{
    // ID(主キー)
    public int EmployeeId { get; set; }

    // [Required]: NOT NULL制約を設定
    // [Column]: "char(10)" を指定して、10桁固定のコードとして定義
    [Required]
    [Column(TypeName = "char(10)")]
    public string EmployeeCode { get; set; }

    // [MaxLength]: 文字列の最大長を50文字に制限(nvarchar(50) などになります)
    [Required]
    [MaxLength(50)]
    public string FullName { get; set; }

    // decimal型は既定では精度が不足する場合があるため明示します
    // ここでは "decimal(12, 2)"(全体12桁、小数点以下2桁)を指定
    [Column(TypeName = "decimal(12, 2)")]
    public decimal Salary { get; set; }

    // C#のDateTimeは時間情報を含みますが、DB側を "date"(日付のみ)に強制します
    [Column(TypeName = "date")]
    public DateTime HireDate { get; set; }

    // 退職日は未定(NULL)の可能性があるため DateTime? にし、型は date を指定
    [Column(TypeName = "date")]
    public DateTime? ResignationDate { get; set; }
}

主要な属性の解説

1. [Column(TypeName = "...")]

データベース固有の型名を直接指定します。

  • char(n) / varchar(n): 固定長や、特定の文字コードセットを使いたい場合に指定します。
  • decimal(p, s): 通貨や科学計算などで、桁数と精度を保証するために必須です。
  • date: 時刻情報が不要なカラム(生年月日や入社日など)に対して指定することで、ストレージを節約し、意図しない時刻データの混入を防ぎます。

2. [MaxLength(n)]

文字列データの最大長を定義します。データベース上では varchar(n)nvarchar(n) として作成され、アプリ側でのバリデーション(入力チェック)のルールとしても機能します。

3. [Required]

プロパティに値が必須であることを示します。データベース上では NOT NULL 制約が付与されます。int などの値型は自動的に NOT NULL になりますが、string などの参照型を必須にしたい場合に使用します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次