Clés secondairesAlternate Keys

Une autre clé sert d’un autre identificateur unique pour chaque instance d’entité en plus de la clé primaire.An alternate key serves as an alternate unique identifier for each entity instance in addition to the primary key. Clés secondaires peuvent être utilisés comme cible d’une relation.Alternate keys can be used as the target of a relationship. Lorsque vous utilisez une base de données relationnelle correspond au concept d’une contrainte/index unique sur les colonnes de clé secondaires et un ou plusieurs contraintes de clé étrangère qui font référence à l’ou les colonnes.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).

Conseil

Si vous souhaitez simplement l’unicité d’une colonne vous ensuite un index unique plutôt qu’une autre clé, consultez index.If you just want to enforce uniqueness of a column then you want a unique index rather than an alternate key, see Indexes. Dans EF, les clés secondaires fournissent davantage de fonctionnalités que les index uniques car ils peuvent être utilisés comme cible d’une clé étrangère.In EF, alternate keys provide greater functionality than unique indexes because they can be used as the target of a foreign key.

Clés secondaires sont généralement introduites pour vous si nécessaire et vous n’avez pas besoin de les configurer manuellement.Alternate keys are typically introduced for you when needed and you do not need to manually configure them. Consultez Conventions pour plus d’informations.See Conventions for more details.

ConventionsConventions

Par convention, une autre clé est introduite pour vous lorsque vous identifiez une propriété qui n’est pas la clé primaire, comme la cible d’une relation.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; }
}

Annotations de donnéesData Annotations

Clés secondaires ne peuvent pas être configurés à l’aide des Annotations de données.Alternate keys can not be configured using Data Annotations.

API FluentFluent API

Vous pouvez utiliser l’API Fluent pour configurer une propriété unique pour être une autre clé.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; }
}

Vous pouvez également utiliser l’API Fluent pour configurer plusieurs propriétés d’une autre clé (comme une autre clé composite).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; }
}