Alternativen SchlüsselAlternate Keys

Ein alternativer Schlüssel dient als eines alternativen eindeutigen Bezeichners für jede Entitätsinstanz zusätzlich zu den primären Schlüssel.An alternate key serves as an alternate unique identifier for each entity instance in addition to the primary key. Alternativer Schlüssel können als Ziel einer Beziehung verwendet werden.Alternate keys can be used as the target of a relationship. Bei Verwendung eine relationale Datenbank ordnet dies das Konzept einer eindeutigen Index/Einschränkung auf die alternativen Schlüsselspalte(n) und eine oder mehrere foreign Key-Einschränkungen, die die Spalten verweisen.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).

Tipp

Wenn Sie nur die Eindeutigkeit einer Spalte zu erzwingen, sollten Sie einen eindeutigen Index, anstatt ein alternativer Schlüssel möchten, finden Sie unter Indizes.If you just want to enforce uniqueness of a column then you want a unique index rather than an alternate key, see Indexes. In der EF Funktionalität Alternativschlüssel größer als eindeutige Indizes, da sie als Ziel eines Fremdschlüssels verwendet werden können.In EF, alternate keys provide greater functionality than unique indexes because they can be used as the target of a foreign key.

Alternativen Schlüssel in der Regel bei Bedarf eingeführt, und Sie müssen nicht manuell konfigurieren.Alternate keys are typically introduced for you when needed and you do not need to manually configure them. Finden Sie unter Konventionen Weitere Details.See Conventions for more details.

KonventionenConventions

Gemäß der Konvention ist ein alternativer Schlüssel für Sie eingeführt, wenn Sie eine Eigenschaft identifizieren, die den Primärschlüssel, nicht als Ziel einer Beziehung ist.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; }
}

DatenanmerkungenData Annotations

Alternativen Schlüssel können nicht mithilfe von Datenanmerkungen konfiguriert werden.Alternate keys can not be configured using Data Annotations.

Fluent-APIFluent API

Sie können die Fluent-API verwenden, so konfigurieren Sie eine einzelne Eigenschaft, um einen alternativen Schlüssel sein.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; }
}

Die Fluent-API können auch um mehrere Eigenschaften für einen alternativen Schlüssel (bekannt als eine zusammengesetzte Alternativschlüssel) werden zu konfigurieren.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; }
}