次の方法で共有


コードファースト規約

Code First を使用すると、C# クラスまたは Visual Basic .NET クラスを使用してモデルを記述できます。 モデルの基本的な形状は、規則を使用して検出されます。 規則は、Code First を使用するときにクラス定義に基づいて概念モデルを自動的に構成するために使用されるルールのセットです。 規則は、System.Data.Entity.ModelConfiguration.Conventions 名前空間で定義されています。

データ注釈または fluent API を使用して、モデルをさらに構成できます。 構成の優先順位は、まず fluent API、次にデータ注釈、最後に規則の順で与えられます。 詳細については、データ注釈Fluent API - リレーションシップFluent API - Types > Properties、および Fluent API with VB.NET を参照してください

コード優先規則の詳細な一覧については、 API ドキュメントを参照してください。 このトピックでは、Code First で使用される規則の概要について説明します。

型の検出

Code First 開発を使用する場合は、通常、概念 (ドメイン) モデルを定義する .NET Framework クラスを記述することから始めます。 クラスを定義するだけでなく、モデルに含める型を DbContext に知らせる必要もあります。 これを行うには、 DbContext から派生し、モデルに含める型の DbSet プロパティを公開するコンテキスト クラスを定義します。 Code First には、これらの型が含まれます。また、参照先の型が別のアセンブリで定義されている場合でも、参照先の型がプルされます。

型が継承階層に参加している場合は、基底クラスの DbSet プロパティを定義するだけで十分です。派生型が基底クラスと同じアセンブリ内にある場合は、自動的に含められます。

次の例では、SchoolEntities クラス (Departments) に定義されている DbSet プロパティは 1 つだけです。 Code First は、このプロパティを利用して、参照されている型を検出して取り込みます。

public class SchoolEntities : DbContext
{
    public DbSet<Department> Departments { get; set; }
}

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

public partial class OnlineCourse : Course
{
    public string URL { get; set; }
}

public partial class OnsiteCourse : Course
{
    public string Location { get; set; }
    public string Days { get; set; }
    public System.DateTime Time { get; set; }
}

モデルから型を除外する場合は、 NotMapped 属性または DbModelBuilder.Ignore fluent API を使用します。

modelBuilder.Ignore<Department>();

主キー規則

Code First は、クラスのプロパティの名前が "ID" (大文字と小文字は区別されない) か、クラス名の後に "ID" が続く場合、プロパティが主キーであると推測します。 主キー プロパティの型が数値または GUID の場合は、ID 列として構成されます。

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }

    . . .  

}

リレーションシップ規則

Entity Framework のナビゲーション プロパティは、2 つのエンティティ型間のリレーションシップをナビゲートする方法を提供します。 すべてのオブジェクトは、そのオブジェクトが参加するすべてのリレーションシップに対してナビゲーション プロパティを持つことができます。 ナビゲーション プロパティを使用すると、双方向のリレーションシップを移動および管理できます。参照オブジェクト (多重度が 1 または 0 または 1 の場合) またはコレクション (多重度が多い場合) を返します。 Code First は、型で定義されているナビゲーション プロパティに基づいてリレーションシップを推論します。

ナビゲーション プロパティに加えて、依存オブジェクトを表す型に外部キー プロパティを含めうことをお勧めします。 プリンシパルの主キーのプロパティと同じデータ型を持つプロパティで、次のいずれかの形式の名前を持つものはリレーションシップの外部キーを表します: '<ナビゲーション プロパティ名><プリンシパル 主キー プロパティ名>'、'<プリンシパル クラス名><主キー プロパティ名>'、または '<プリンシパル 主キー プロパティ名>'。 複数の一致が見つかった場合は、上記の順序で優先順位が指定されます。 外部キーの検出では、大文字と小文字は区別されません。 外部キー プロパティが検出されると、Code First は外部キーの null 許容に基づいてリレーションシップの多重度を推論します。 プロパティが null 許容の場合、リレーションシップは省略可能として登録されます。それ以外の場合、リレーションシップは必要に応じて登録されます。

依存エンティティの外部キーが null 許容でない場合、Code First はリレーションシップに連鎖削除を設定します。 依存エンティティの外部キーが null 許容の場合、Code First はリレーションシップに連鎖削除を設定せず、プリンシパルが削除されると外部キーは null に設定されます。 規則によって検出された多重度と連鎖削除の動作は、fluent API を使用してオーバーライドできます。

次の例では、ナビゲーション プロパティと外部キーを使用して、Department クラスと Course クラス間のリレーションシップを定義します。

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

同じ型間に複数のリレーションシップがある場合 (たとえば、 Person クラスと Book クラスを定義し、 Person クラスに ReviewedBooks ナビゲーション プロパティと AuthoredBooks ナビゲーション プロパティが含まれており、 Book クラスに Author ナビゲーション プロパティと Reviewer ナビゲーション プロパティが含まれている場合)、データ注釈または fluent API を使用してリレーションシップを手動で構成する必要があります。 詳細については、「 データ注釈 - リレーションシップFluent API - リレーションシップ」を参照してください。

複合型の約束事

Code First が、主キーを推論できないクラス定義を検出し、データ注釈または fluent API を介して主キーが登録されていない場合、その型は複合型として自動的に登録されます。 複合型検出では、型にエンティティ型を参照するプロパティが存在せず、別の型のコレクション プロパティから参照されていないことも必要です。 次のクラス定義を指定すると、主キーがないため、Code First は Details が複合型であると推測します。

public partial class OnsiteCourse : Course
{
    public OnsiteCourse()
    {
        Details = new Details();
    }

    public Details Details { get; set; }
}

public class Details
{
    public System.DateTime Time { get; set; }
    public string Location { get; set; }
    public string Days { get; set; }
}

接続文字列の規則

DbContext が使用する接続を検出するために使用する規則については、「 接続とモデル」を参照してください。

慣習の削除

System.Data.Entity.ModelConfiguration.Conventions 名前空間で定義されている規則を削除できます。 次の例では 、PluralizingTableNameConvention を削除します。

public class SchoolEntities : DbContext
{
     . . .

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Configure Code First to ignore PluralizingTableName convention
        // If you keep this convention, the generated tables  
        // will have pluralized names.
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

カスタム規則

カスタム規則は、EF6 以降でサポートされています。 詳細については、「 カスタム コードの最初の規則」を参照してください。