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 などの参照型を必須にしたい場合に使用します。
