Klucze alternatywneAlternate Keys

Klucz alternatywny służy jako alternatywny identyfikator unikatowy dla każdego wystąpienia jednostki, oprócz klucza podstawowego.An alternate key serves as an alternate unique identifier for each entity instance in addition to the primary key. Klucze alternatywne może służyć jako element docelowy relacji.Alternate keys can be used as the target of a relationship. Korzystanie z relacyjnej bazy danych to mapuje do koncepcji unikatowego indeksu/ograniczenia na alternatywny kolumn kluczy i jeden lub więcej ograniczeń klucza obcego odwołujące się do kolumn na liście.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).

Porada

Jeśli chcesz wymusić unikatowości kolumny, a następnie chcesz zamiast klucza alternatywnego unikatowego indeksu, zobacz indeksów.If you just want to enforce uniqueness of a column then you want a unique index rather than an alternate key, see Indexes. EF klucze alternatywne zapewniają większą funkcjonalność niż unikatowe indeksy ponieważ mogą zostać użyte jako element docelowy klucz obcy.In EF, alternate keys provide greater functionality than unique indexes because they can be used as the target of a foreign key.

Klucze alternatywne zwykle są wprowadzane automatycznie w razie potrzeby i nie trzeba ręcznie skonfigurować je.Alternate keys are typically introduced for you when needed and you do not need to manually configure them. Zobacz konwencje więcej szczegółów.See Conventions for more details.

KonwencjeConventions

Według Konwencji klucza alternatywnego wprowadzono automatycznie podczas określania właściwości, która nie jest kluczem podstawowym jako element docelowy relacji.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; }
}

Adnotacji danychData Annotations

Nie można skonfigurować alternatywne klucze za pomocą adnotacji danych.Alternate keys can not be configured using Data Annotations.

Interfejsu API FluentFluent API

Aby skonfigurować jedną właściwość klucza alternatywnego za można Użyj interfejsu API Fluent.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; }
}

Aby skonfigurować wiele właściwości klucza alternatywnego (znany jako alternatywny klucz złożony) umożliwia także interfejsu API Fluent.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; }
}