主キーの設定
主キーはデータベース設計で必須要素です。Code Firstでは[Key]属性を使用して明示的に指定します。
[Key]
public int ItemCode { get; set; }
デフォルト動作:プロパティ名が「ID」または「クラス名+ID」かつint型の場合、自動的に主キーとして認識され、自動インクリメントが有効になります。自動インクリメントを無効化する例:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ItemCode { get; set; }
DatabaseGeneratedOptionの主な設定値:
- Identity:整数型/GUID型の自動生成
- Computed:データベース計算列
- None:自動生成無効
複合主鍵はData Annotationでは設定不可のため、Fluent APIを使用します。
modelBuilder.Entity<InventoryItem>().HasKey(t => new { t.ItemCode, t.GroupID });
列名とデータ型のカスタマイズ
[Column]属性で列名とデータ型を指定可能です。
[Column("ItemDescription", TypeName = "text")]
public string Description { get; set; }
Fluent APIによる同等の設定:
modelBuilder.Entity<InventoryItem>().Property(t => t.Description)
.HasColumnName("ItemDescription")
.HasColumnType("text");
数値型の精度設定
decimal型の精度設定はData Annotationではサポートされていないため、Fluent APIが必要です。
modelBuilder.Entity<InventoryItem>().Property(t => t.UnitCost)
.HasPrecision(18, 2);
文字列制約
文字列長の制約にはMaxLength、MinLength、StringLengthを使用します。
[Required]
[MaxLength(100)]
[MinLength(20)]
public string DetailedDescription { get; set; }
[StringLength(6)]
public string AccessCode { get; set; }
Unicodeエンコーディング
string型のUnicode設定変更はFluent APIで実現します。
modelBuilder.Entity<InventoryItem>().Property(t => t.Description)
.IsRequired()
.IsUnicode(false);
マッピング除外
[NotMapped]属性でプロパティやクラスのデータベースマッピングを除外できます。
[NotMapped]
public string DisplayName { get; set; }
Fluent APIでの設定例:
modelBuilder.Entity<InventoryItem>().Ignore(t => t.DisplayName);
modelBuilder.Ignore<InventoryItem>();
コンカレンシー制御
競合制御には[Timestamp]と[ConcurrencyCheck]属性を使用します。
[Timestamp]
public Byte[] VersionControl { get; set; }
[ConcurrencyCheck]
public string CriticalData { get; set; }