Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una clave actúa como un identificador único para cada instancia de entidad. La mayoría de las entidades de EF tienen una sola clave, que se asigna al concepto de una clave principal en bases de datos relacionales (para entidades sin claves, consulte Entidades sin claves). Las entidades pueden tener claves adicionales más allá de la clave principal (consulte Claves alternativas para obtener más información).
Configuración de una clave principal
Por convención, una propiedad denominada Id
o <type name>Id
se configurará como clave principal de una entidad.
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.
Puede configurar una sola propiedad para que sea la clave principal de una entidad de la siguiente manera:
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; esto se conoce como clave compuesta. Las convenciones solo configurarán una clave compuesta en casos específicos, como para una colección de tipos propios.
[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; }
}
Generación de valor
En el caso de las claves principales numéricas y GUID no compuestas, EF Core configura automáticamente la generación de valores por convención. Por ejemplo, una clave principal numérica en SQL Server se configura automáticamente para que sea una columna IDENTITY. Para obtener más información, consulte la documentación sobre generación de valores e instrucciones para estrategias de asignación de herencia específicas.
Nombre de clave principal
Por convención, en las bases de datos relacionales las claves principales se crean con el nombre PK_<type name>
. Puede configurar el nombre de la restricción de clave principal de la siguiente manera:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasKey(b => b.BlogId)
.HasName("PrimaryKey_BlogId");
}
Tipos y valores de clave
Aunque EF Core admite el uso de propiedades de cualquier tipo primitivo como clave principal, incluidas string
, Guid
y byte[]
otras, no todas las bases de datos admiten todos los tipos como claves. En algunos casos, los valores de clave se pueden convertir automáticamente en un tipo admitido; de lo contrario, la conversión se debe especificar manualmente.
Las propiedades de clave siempre deben tener un valor no predeterminado al agregar una nueva entidad al contexto, pero la base de datos generará algunos tipos. En ese caso, EF intentará generar un valor temporal cuando se agregue la entidad con fines de seguimiento. Después de llamar a SaveChanges , el valor temporal se reemplazará por el valor generado por la base de datos.
Importante
Si una propiedad de clave tiene su valor generado por la base de datos y se especifica un valor no predeterminado cuando se agrega una entidad, EF asume que la entidad ya existe en la base de datos e intentará actualizarla en lugar de insertar una nueva. Para evitar esto, desactive la generación de valores o vea cómo especificar valores explícitos para las propiedades generadas.
Claves alternativas
Una clave alternativa actúa como un identificador único alternativo para cada instancia de entidad además de la clave principal; se puede usar como destino de una relación. Cuando se utiliza una base de datos relacional, esto se corresponde con el concepto de un índice único o una restricción única en la columna o columnas de clave alternativa y una o más restricciones de clave externa que hacen referencia a dichas columnas.
Sugerencia
Si solo desea aplicar la unicidad en una columna, defina un índice único en lugar de una clave alternativa (consulte Índices). En EF, las claves alternativas son de solo lectura y proporcionan semántica adicional sobre índices únicos, ya que se pueden usar como destino de una clave externa.
Las claves alternativas se suelen introducir automáticamente cuando sea necesario y no es necesario configurarlas manualmente. Por convención, se introduce una clave alternativa cuando identifica como destino de una relación una propiedad que no es la clave principal.
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:
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):
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 <property name>
alternativas compuestas se convierte en una lista separada por subrayado de nombres de propiedad). Puede configurar el nombre del índice de la clave alternativa y la restricción única:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => c.LicensePlate)
.HasName("AlternateKey_LicensePlate");
}