Code First 規則Code First Conventions

Code First を使用すると、C# または Visual Basic .NET クラスを使用してモデルを記述できます。Code First enables you to describe a model by using C# or Visual Basic .NET classes. モデルの基本図形は、規約を使用して検出されます。The basic shape of the model is detected by using conventions. 規則は、Code First を操作するときに、クラス定義に基づいて概念モデルを自動的に構成するために使用される規則のセットです。Conventions are sets of rules that are used to automatically configure a conceptual model based on class definitions when working with Code First. 規則は、system.string 名前空間で定義されています。The conventions are defined in the System.Data.Entity.ModelConfiguration.Conventions namespace.

データ注釈または fluent API を使用して、モデルをさらに構成できます。You can further configure your model by using data annotations or the fluent API. 優先順位は、fluent API の後にデータ注釈と規則を使用して構成されます。Precedence is given to configuration through the fluent API followed by data annotations and then conventions. 詳細については、「 データ注釈」、「 Fluent api-リレーションシップ」、「 fluent api 型 & プロパティ 」、および「 VB.NET を使用した fluent api」を参照してください。For more information see Data Annotations, Fluent API - Relationships, Fluent API - Types & Properties and Fluent API with VB.NET.

Code First の規則の詳細な一覧については、 API のドキュメントを参照してください。A detailed list of Code First conventions is available in the API Documentation. このトピックでは、Code First によって使用される規則の概要について説明します。This topic provides an overview of the conventions used by Code First.

種類の検出Type Discovery

Code First 開発を使用する場合は、通常、概念 (ドメイン) モデルを定義する .NET Framework クラスを記述することから始めます。When using Code First development you usually begin by writing .NET Framework classes that define your conceptual (domain) model. クラスを定義するだけでなく、モデルに含める型を Dbcontext に知らせる必要もあります。In addition to defining the classes, you also need to let DbContext know which types you want to include in the model. これを行うには、 dbcontext から派生したコンテキストクラスを定義し、モデルに含める型の dbcontext プロパティを公開します。To do this, you define a context class that derives from DbContext and exposes DbSet properties for the types that you want to be part of the model. Code First にはこれらの型が含まれ、参照される型が別のアセンブリで定義されている場合でも、参照される型がすべて取得されます。Code First will include these types and also will pull in any referenced types, even if the referenced types are defined in a different assembly.

型が継承階層に参加している場合は、基本クラスの Dbset プロパティを定義するだけで十分です。基底クラスと同じアセンブリ内にある場合は、派生型が自動的に含まれます。If your types participate in an inheritance hierarchy, it is enough to define a DbSet property for the base class, and the derived types will be automatically included, if they are in the same assembly as the base class.

次の例では、 SchoolEntities クラス (department) で定義されているdbsetプロパティは1つだけです。In the following example, there is only one DbSet property defined on the SchoolEntities class (Departments). Code First は、このプロパティを使用して、参照されるすべての型を検出し、プルします。Code First uses this property to discover and pull in any referenced types.

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 を使用します。 fluent API を無視します。If you want to exclude a type from the model, use the NotMapped attribute or the DbModelBuilder.Ignore fluent API.

modelBuilder.Ignore<Department>();

主キーの規則Primary Key Convention

クラスのプロパティの名前が "ID" である場合 (大文字と小文字は区別されません)、またはクラス名の後に "ID" が続く場合、Code First は、プロパティが主キーであると推測します。Code First infers that a property is a primary key if a property on a class is named “ID” (not case sensitive), or the class name followed by "ID". 主キープロパティの型が数値または GUID の場合は、id 列として構成されます。If the type of the primary key property is numeric or GUID it will be configured as an identity column.

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

    . . .  

}

リレーションシップ規則Relationship Convention

Entity Framework では、ナビゲーション プロパティによって、2 つのエンティティ型間のリレーションシップをナビゲートする手段が提供されます。In Entity Framework, navigation properties provide a way to navigate a relationship between two entity types. 各オブジェクトは、参加する各リレーションシップに対してナビゲーション プロパティを持つことができます。Every object can have a navigation property for every relationship in which it participates. ナビゲーションプロパティを使用すると、リレーションシップを双方向に移動して管理し、参照オブジェクト (多重度が1または0または1のいずれか) またはコレクション (多重度が多の場合) を返すことができます。Navigation properties allow you to navigate and manage relationships in both directions, returning either a reference object (if the multiplicity is either one or zero-or-one) or a collection (if the multiplicity is many). Code First は、型に定義されているナビゲーションプロパティに基づいてリレーションシップを推測します。Code First infers relationships based on the navigation properties defined on your types.

ナビゲーションプロパティに加えて、依存オブジェクトを表す型に外部キープロパティを含めることをお勧めします。In addition to navigation properties, we recommend that you include foreign key properties on the types that represent dependent objects. プリンシパルプライマリキープロパティと同じデータ型で、次のいずれかの形式の名前を持つプロパティは、リレーションシップの外部キー (' <navigation property name> <principal primary key property name> '、' <principal class name> <primary key property name> '、または ' ') を表し <principal primary key property name> ます。Any property with the same data type as the principal primary key property and with a name that follows one of the following formats represents a foreign key for the relationship: '<navigation property name><principal primary key property name>', '<principal class name><primary key property name>', or '<principal primary key property name>'. 複数の一致が見つかった場合は、上記の順序で優先順位が付けられます。If multiple matches are found then precedence is given in the order listed above. 外部キーの検出では、大文字と小文字は区別されません。Foreign key detection is not case sensitive. 外部キープロパティが検出されると、Code First 外部キーの null 値の許容に基づいて、リレーションシップの多重度が推測されます。When a foreign key property is detected, Code First infers the multiplicity of the relationship based on the nullability of the foreign key. プロパティが null 値を許容する場合、リレーションシップはオプションとして登録されます。それ以外の場合、リレーションシップは必須として登録されます。If the property is nullable then the relationship is registered as optional; otherwise the relationship is registered as required.

依存エンティティの外部キーが null 値を許容しない場合、Code First はリレーションシップに対して連鎖削除を設定します。If a foreign key on the dependent entity is not nullable, then Code First sets cascade delete on the relationship. 依存エンティティの外部キーが null 許容である場合、Code First はリレーションシップに対して連鎖削除を設定しません。また、プリンシパルが削除されると、外部キーは null に設定されます。If a foreign key on the dependent entity is nullable, Code First does not set cascade delete on the relationship, and when the principal is deleted the foreign key will be set to null. 規則によって検出された多重度と連鎖削除の動作は、fluent API を使用してオーバーライドできます。The multiplicity and cascade delete behavior detected by convention can be overridden by using the fluent API.

次の例では、ナビゲーションプロパティと外部キーを使用して、Department クラスと Course クラス間のリレーションシップを定義しています。In the following example the navigation properties and a foreign key are used to define the relationship between the Department and Course classes.

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 クラスReviewedBooksおよびauthoredbooksナビゲーションプロパティPersonが含まれていて、 book クラスに****作成者レビュー担当者のナビゲーションプロパティが含まれている場合)、データ注釈または fluent API を使用してリレーションシップを手動で構成する必要があります。If you have multiple relationships between the same types (for example, suppose you define the Person and Book classes, where the Person class contains the ReviewedBooks and AuthoredBooks navigation properties and the Book class contains the Author and Reviewer navigation properties) you need to manually configure the relationships by using Data Annotations or the fluent API. 詳細については、「 データ注釈-リレーションシップ 」と「 Fluent API-リレーションシップ」を参照してください。For more information, see Data Annotations - Relationships and Fluent API - Relationships.

複合型の規則Complex Types Convention

主キーを推論できず、データ注釈または fluent API によって登録される主キーがないクラス定義を Code First が検出すると、その型は複合型として自動的に登録されます。When Code First discovers a class definition where a primary key cannot be inferred, and no primary key is registered through data annotations or the fluent API, then the type is automatically registered as a complex type. 複合型の検出では、型がエンティティ型を参照するプロパティを持たず、別の型のコレクションプロパティから参照されていないことも必要です。Complex type detection also requires that the type does not have properties that reference entity types and is not referenced from a collection property on another type. 次のクラス定義を指定すると Code First 主キーがないため、 詳細 が複合型であると推論されます。Given the following class definitions Code First would infer that Details is a complex type because it has no primary key.

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

接続文字列の表記規則Connection String Convention

使用する接続を検出するために DbContext が使用する規則については、「 接続とモデル」を参照してください。To learn about the conventions that DbContext uses to discover the connection to use see Connections and Models.

規則の削除Removing Conventions

System.string 名前空間で定義されている任意の規則を削除できます。You can remove any of the conventions defined in the System.Data.Entity.ModelConfiguration.Conventions namespace. 次の例では、 PluralizingTableNameConventionを削除します。The following example removes 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>();
    }
}

カスタム規約Custom Conventions

カスタム規則は EF6 以降でサポートされています。Custom conventions are supported in EF6 onwards. 詳細については、「 カスタム Code First 規則」を参照してください。For more information see Custom Code First Conventions.