Chaves alternativasAlternate Keys

Uma chave alternativa serve como um identificador exclusivo alternativo para cada instância de entidade além da chave primária.An alternate key serves as an alternate unique identifier for each entity instance in addition to the primary key. Chaves alternativas podem ser usadas como o destino de uma relação.Alternate keys can be used as the target of a relationship. Ao usar um banco de dados relacional mapeia para o conceito de um índice/restrição unique em colunas-chave alternativas e um ou mais restrições de chave estrangeira que referenciam as colunas.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).

Dica

Se você quiser impor exclusividade de uma coluna, em seguida, você deseja que um índice exclusivo em vez de uma chave alternativa, consulte índices.If you just want to enforce uniqueness of a column then you want a unique index rather than an alternate key, see Indexes. No EF, chaves alternativas fornecem maior funcionalidade de índices exclusivos, porque eles podem ser usados como o destino de uma chave estrangeira.In EF, alternate keys provide greater functionality than unique indexes because they can be used as the target of a foreign key.

Chaves alternativas normalmente são introduzidas para você quando necessário e você não precisa configurá-los manualmente.Alternate keys are typically introduced for you when needed and you do not need to manually configure them. Consulte convenções para obter mais detalhes.See Conventions for more details.

ConvençõesConventions

Por convenção, uma chave alternativa é introduzida para você quando você identifica uma propriedade, o que não é a chave primária, como o destino de uma relação.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; }
}

Anotações de dadosData Annotations

Chaves alternativas não podem ser configuradas usando as anotações de dados.Alternate keys can not be configured using Data Annotations.

API fluenteFluent API

Você pode usar a API fluente para configurar uma única propriedade para ser uma chave alternativa.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; }
}

Você também pode usar a API fluente para configurar várias propriedades para ser uma chave alternativa (conhecida como uma chave composta de alternativa).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; }
}