代替キーAlternate Keys

代替キーは、主キーだけでなくエンティティ インスタンスごとに、代替の一意の識別子として機能します。An alternate key serves as an alternate unique identifier for each entity instance in addition to the primary key. 代替キーは、リレーションシップのターゲットとして使用できます。Alternate keys can be used as the target of a relationship. リレーショナル データベースを使用するときに代替のキー列と 1 つまたは複数外部キー制約、列を参照する一意のインデックス/制約の概念にマッピングします。When using a relational database this maps to the concept of a unique index/constraint on the alternate key column(s) and one or more foreign key constraints that reference the column(s).

ヒント

代替キーではなく、一意のインデックスの場合、列の一意性を適用する場合は、「インデックスです。If you just want to enforce uniqueness of a column then you want a unique index rather than an alternate key, see Indexes. EF には、代替キーは、外部キーの対象として使用されることがあるために、一意のインデックスよりも大きい機能を提供します。In EF, alternate keys provide greater functionality than unique indexes because they can be used as the target of a foreign key.

代替キーが通常導入されています必要なときに、これらを手動で構成する必要はありません。Alternate keys are typically introduced for you when needed and you do not need to manually configure them. 参照してください規則詳細についてはします。See Conventions for more details.

規則Conventions

慣例により、リレーションシップのターゲットとして、主キーではないプロパティを識別する場合の代替キーが導入されました。By convention, an alternate key is introduced for you when you identify a property, that is not the primary key, as the target of a relationship.

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogUrl)
            .HasPrincipalKey(b => b.Url);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public string BlogUrl { get; set; }
    public Blog Blog { get; set; }
}

データの注釈Data Annotations

データ注釈を使用する代替キーを構成できないことができます。Alternate keys can not be configured using Data Annotations.

Fluent APIFluent API

Fluent API を使用して、代替キーとして使用する 1 つのプロパティを構成することができます。You can use the Fluent API to configure a single property to be an alternate key.

class MyContext : DbContext
{
    public DbSet<Car> Cars { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>()
            .HasAlternateKey(c => c.LicensePlate);
    }
}

class Car
{
    public int CarId { get; set; }
    public string LicensePlate { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}

代替キー (複合代替キーと呼ばれます) である複数のプロパティを構成するのに Fluent API を使用することもできます。You can also use the Fluent API to configure multiple properties to be an alternate key (known as a composite alternate key).

class MyContext : DbContext
{
    public DbSet<Car> Cars { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>()
            .HasAlternateKey(c => new { c.State, c.LicensePlate });
    }
}

class Car
{
    public int CarId { get; set; }
    public string State { get; set; }
    public string LicensePlate { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}