Entity Framework Code Firstにおける主なマッピング規約

主キーの設定

主キーはデータベース設計で必須要素です。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);

文字列制約

文字列長の制約にはMaxLengthMinLengthStringLengthを使用します。

[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; }

タグ: EntityFramework CodeFirst データマッピング 主キー設定 FluentAPI

7月3日 23:23 投稿