ClavesKeys

Una clave actúa como identificador único para cada instancia de la entidad.A key serves as a unique identifier for each entity instance. La mayoría de las entidades de EF tienen una sola clave, que se asigna al concepto de una clave principal en las bases de datos relacionales (para entidades sin claves, vea entidadessin clave).Most entities in EF have a single key, which maps to the concept of a primary key in relational databases (for entities without keys, see Keyless entities). Las entidades pueden tener claves adicionales más allá de la clave principal (consulte claves alternativas para obtener más información).Entities can have additional keys beyond the primary key (see Alternate Keys for more information).

Configuración de una clave principalConfiguring a primary key

Por Convención, se Id configurará una propiedad denominada o <type name>Id como la clave principal de una entidad.By convention, a property named Id or <type name>Id will be configured as the primary key of an 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; }
}

Nota

Los tipos de entidad de propiedad usan reglas diferentes para definir claves.Owned entity types use different rules to define keys.

Puede configurar una única propiedad para que sea la clave principal de una entidad, como se indica a continuación:You can configure a single property to be the primary key of an entity as follows:

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

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

También puede configurar varias propiedades para que sean la clave de una entidad, lo que se conoce como clave compuesta.You can also configure multiple properties to be the key of an entity - this is known as a composite key. Las claves compuestas solo se pueden configurar mediante la API fluida; las convenciones nunca configurarán una clave compuesta y no se pueden usar anotaciones de datos para configurar una.Composite keys can only be configured using the Fluent API; conventions will never set up a composite key, and you can not use Data Annotations to configure one.

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

Generación de valorValue generation

En el caso de las claves principales no compuestas y de GUID, EF Core configura la generación de valores por Convención.For non-composite numeric and GUID primary keys, EF Core sets up value generation for you by convention. Por ejemplo, una clave principal numérica en SQL Server se configura automáticamente para que sea una columna de identidad.For example, a numeric primary key in SQL Server is automatically set up to be an IDENTITY column. Para obtener más información, consulte la documentación sobre la generación de valores.For more information, see the documentation on value generation.

Nombre de clave principalPrimary key name

Por Convención, en las bases de datos relacionales, las claves principales se crean con el nombre PK_<type name> .By convention, on relational databases primary keys are created with the name PK_<type name>. Puede configurar el nombre de la restricción Primary Key de la manera siguiente:You can configure the name of the primary key constraint as follows:

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

Tipos de clave y valoresKey types and values

Aunque EF Core admite el uso de propiedades de cualquier tipo primitivo como clave principal, string incluidos Guid , byte[] y otros, no todas las bases de datos admiten todos los tipos como claves.While EF Core supports using properties of any primitive type as the primary key, including string, Guid, byte[] and others, not all databases support all types as keys. En algunos casos, los valores de clave se pueden convertir automáticamente a un tipo compatible, de lo contrario, la conversión se debe especificar manualmente.In some cases the key values can be converted to a supported type automatically, otherwise the conversion should be specified manually.

Las propiedades de clave deben tener siempre un valor no predeterminado al agregar una nueva entidad al contexto, pero la base de datos generaráalgunos tipos.Key properties must always have a non-default value when adding a new entity to the context, but some types will be generated by the database. En ese caso, EF intentará generar un valor temporal cuando la entidad se agregue con fines de seguimiento.In that case EF will try to generate a temporary value when the entity is added for tracking purposes. Después de llamar a SaveChanges , el valor temporal se reemplazará por el valor generado por la base de datos.After SaveChanges is called the temporary value will be replaced by the value generated by the database.

Importante

Si una propiedad de clave tiene su valor generado por la base de datos y se especifica un valor no predeterminado al agregar una entidad, EF asumirá que la entidad ya existe en la base de datos e intentará actualizarla en lugar de insertar una nueva.If a key property has its value generated by the database and a non-default value is specified when an entity is added, then EF will assume that the entity already exists in the database and will try to update it instead of inserting a new one. Para evitar esto, desactive la generación de valores o vea Cómo especificar valores explícitos para las propiedades generadas.To avoid this, turn off value generation or see how to specify explicit values for generated properties.

Claves alternativasAlternate Keys

Una clave alternativa actúa como identificador único alternativo para cada instancia de entidad además de la clave principal; se puede usar como destino de una relación.An alternate key serves as an alternate unique identifier for each entity instance in addition to the primary key; it can be used as the target of a relationship. Al utilizar una base de datos relacional, se asigna al concepto de un índice o una restricción únicos en las columnas de clave alternativas y una o varias restricciones de clave externa que hacen referencia a las columnas.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).

Sugerencia

Si solo desea exigir la unicidad en una columna, defina un índice único en lugar de una clave alternativa (consulte índices).If you just want to enforce uniqueness on a column, define a unique index rather than an alternate key (see Indexes). En EF, las claves alternativas son de solo lectura y proporcionan una semántica adicional sobre índices únicos, ya que se pueden usar como destino de una clave externa.In EF, alternate keys are read-only and provide additional semantics over unique indexes because they can be used as the target of a foreign key.

Normalmente, se introducen claves alternativas cuando sea necesario y no es necesario configurarlas manualmente.Alternate keys are typically introduced for you when needed and you do not need to manually configure them. Por Convención, se introduce una clave alternativa cuando se identifica una propiedad que no es la clave principal como destino de una relación.By convention, an alternate key is introduced for you when you identify a property which isn't the primary key as the target of a relationship.

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

También puede configurar una sola propiedad para que sea una clave alternativa:You can also configure a single property to be an alternate key:

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

También puede configurar varias propiedades para que sean una clave alternativa (conocida como clave alternativa compuesta):You can also configure multiple properties to be an alternate key (known as a composite alternate key):

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

Por último, por Convención, el índice y la restricción que se introducen para una clave alternativa se denominarán AK_<type name>_<property name> (para las claves alternativas compuestas <property name> se convierte en una lista de nombres de propiedad separados por guiones bajos).Finally, by convention, the index and constraint that are introduced for an alternate key will be named AK_<type name>_<property name> (for composite alternate keys <property name> becomes an underscore separated list of property names). Puede configurar el nombre del índice de la clave alternativa y la restricción UNIQUE:You can configure the name of the alternate key's index and unique constraint:

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