Klíče

Klíč slouží jako jedinečný identifikátor pro každou instanci entity. Většina entit v EF má jeden klíč, který se mapuje na koncept primárního klíče v relačních databázích (pro entity bez klíčů viz entity bez klíčů). Entity můžou mít další klíče nad rámec primárního klíče (další informace najdete v tématu Alternativní klíče ).

Konfigurace primárního klíče

Podle konvence se vlastnost s názvem Id nebo <type name>Id bude nakonfigurována jako primární klíč entity.

internal class Car
{
    public string Id { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

internal class Truck
{
    public string TruckId { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

Poznámka

Typy vlastněných entit používají k definování klíčů různá pravidla.

Jednu vlastnost můžete nakonfigurovat tak, aby byla primárním klíčem entity:

internal class Car
{
    [Key]
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

Můžete také nakonfigurovat více vlastností, které mají být klíčem entity – označuje se jako složený klíč. Konvence nastaví složený klíč pouze v konkrétních případech – například pro kolekci vlastněných typů.

Poznámka

Atribut [PrimaryKey] byl zaveden v EF Core 7.0. Používejte rozhraní Fluent API ve starších verzích.

[PrimaryKey(nameof(State), nameof(LicensePlate))]
internal class Car
{
    public string State { get; set; }
    public string LicensePlate { get; set; }

    public string Make { get; set; }
    public string Model { get; set; }
}

Vytváření hodnoty

Pro neseloženého číselného a GUID primárního klíče nastaví EF Core generování hodnot podle konvence. Například číselný primární klíč v SQL Serveru se automaticky nastaví jako sloupec IDENTITY. Další informace najdete v dokumentaci ke generování hodnot a pokyny ke konkrétním strategiím mapování dědičnosti.

Název primárního klíče

Podle konvence se vytvoří primární klíče relačních databází s názvem PK_<type name>. Název omezení primárního klíče můžete nakonfigurovat následujícím způsobem:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasKey(b => b.BlogId)
        .HasName("PrimaryKey_BlogId");
}

Typy klíčů a hodnoty

I když EF Core podporuje použití vlastností jakéhokoli primitivního typu jako primárního klíče, včetně string, byte[]Guida dalších, ne všechny databáze podporují všechny typy jako klíče. V některých případech je možné hodnoty klíče automaticky převést na podporovaný typ, jinak by se měl převod zadat ručně.

Vlastnosti klíče musí mít při přidávání nové entity do kontextu vždy jinou než výchozí hodnotu, ale databáze vygeneruje některé typy. V takovém případě se EF pokusí vygenerovat dočasnou hodnotu při přidání entity pro účely sledování. Po zavolání SaveChanges se dočasná hodnota nahradí hodnotou vygenerovanou databází.

Důležité

Pokud má vlastnost klíče hodnotu vygenerovanou databází a při přidání entity je zadána jiná než výchozí hodnota, ef předpokládá, že entita již v databázi existuje a pokusí se ji aktualizovat místo vložení nové. Pokud se tomu chcete vyhnout, vypněte generování hodnot nebo zjistěte , jak zadat explicitní hodnoty pro vygenerované vlastnosti.

Alternativní klíče

Alternativní klíč slouží jako alternativní jedinečný identifikátor pro každou instanci entity kromě primárního klíče; lze ho použít jako cíl relace. Při použití relační databáze se namapuje na koncept jedinečného indexu nebo omezení pro alternativní klíčové sloupce a jedno nebo více omezení cizího klíče, která odkazují na sloupce.

Tip

Pokud chcete pouze vynutit jedinečnost u sloupce, definujte jedinečný index místo alternativního klíče (viz indexy). V EF jsou alternativní klíče jen pro čtení a poskytují další sémantiku nad jedinečnými indexy, protože je možné je použít jako cíl cizího klíče.

Alternativní klíče se obvykle zavádějí v případě potřeby a nemusíte je konfigurovat ručně. Podle konvence se pro vás zavádí alternativní klíč, když identifikujete vlastnost, která není primárním klíčem jako cíl relace.

internal 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; }
}

Můžete také nakonfigurovat jednu vlastnost tak, aby byla alternativním klíčem:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => c.LicensePlate);
}

Můžete také nakonfigurovat více vlastností jako alternativní klíč (označovaný jako složený alternativní klíč):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => new { c.State, c.LicensePlate });
}

Nakonec bude index a omezení zavedené pro alternativní klíč pojmenované AK_<type name>_<property name> (pro složené alternativní klíče <property name> se stane podtržítkem odděleným seznamem názvů vlastností). Můžete nakonfigurovat název indexu alternativního klíče a jedinečné omezení:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Car>()
        .HasAlternateKey(c => c.LicensePlate)
        .HasName("AlternateKey_LicensePlate");
}