Klíče

Klíč slouží jako jedinečný identifikátor pro každou instanci entity. Většina entit v EF má jediný 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 nakonfiguruje 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

Vlastní typy entit používají pro definování klíčů různá pravidla.

Jednu vlastnost můžete nastavit jako primární klíč entity následujícím způsobem:

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 – to se označuje jako složený klíč. složené klíče se dají konfigurovat jenom pomocí rozhraní Fluent API. konvence nikdy nenastaví složený klíč a nejdou použít datové poznámky ke konfiguraci jednoho.

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

Vytváření hodnoty

V případě nesloženého číselného a primárního klíče GUID EF Core nastaví generování hodnoty podle konvence. například numerický primární klíč v SQL Server je automaticky nastaven jako sloupec IDENTITY. Další informace najdete v dokumentaci k generaci hodnot.

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

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

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

Typy a hodnoty klíčů

I když EF Core podporuje použití vlastností libovolného primitivního typu jako primárního klíče, včetně string , Guidbyte[] a 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 převést na podporovaný typ automaticky, jinak by se měl převod zadat ručně.

Při přidávání nové entity do kontextu musí mít klíčové vlastnosti vždy jinou než výchozí hodnotu, ale v databázi budou vygeneroványněkteré typy. V takovém případě EF se při přidání entity pro účely sledování pokusí vygenerovat dočasnou hodnotu. Po volání metody SaveChanges se tato dočasná hodnota nahradí hodnotou generovanou databází.

Důležité

Pokud má klíčová vlastnost hodnotu vygenerovanou databází a při přidání entity je zadaná jiná než výchozí hodnota, pak EF předpokládá, že entita v databázi již existuje a pokusí se ji aktualizovat místo vložení nového. Pokud se tomu chcete vyhnout, vypněte generování hodnoty 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; dá se použít jako cíl relace. Při použití relační databáze se tato mapa mapuje na koncept jedinečného indexu nebo omezení pro sloupce nebo sloupce alternativních klíčů a jedno nebo více omezení cizího klíče, které odkazují na sloupce.

Tip

Pokud chcete u sloupce jenom vyhovět jedinečnost, 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 v rámci jedinečných indexů, protože je lze použít jako cíl cizího klíče.

V případě potřeby jsou obvykle zavedeny alternativní klíče a není nutné je ručně konfigurovat. Podle konvence se pro vás zavede 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; }
}

Jednu vlastnost můžete také nakonfigurovat 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 se podle konvence index a omezení, které jsou představené pro alternativní klíč, budou pojmenovat AK_<type name>_<property name> (u složených alternativních klíčů <property name> se jako oddělený seznam názvů vlastností zobrazí podtržítko). 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");
}