代替キー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; }
}