Cómo especificar una clave única en el código EF 7 primero con anotaciones de datos

code-first data-annotations entity-framework entity-framework-core

Pregunta

Puede especificar una clave única con Fluent Api:

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasIndex(u => u.Nickname)
            .IsUnique();
    }
}

public class User
{
    public int UserId { get; set; }
    public string Nickname { get; set; }
}

¿Pero puedes hacerlo con Anotaciones de Datos?

Editar

Los métodos cambian en EF7 Beta 8:

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasIndex(u => u.Nickname)
            .IsUnique();
    }
}

public class User
{
    public int UserId { get; set; }
    public string Nickname { get; set; }
}

Respuesta aceptada

Me temo que la creación de un Index con Anotación de datos todavía no es compatible con EF 7. Verifique este enlace .

También traté de encontrar información relacionada con ese tema en los últimos lanzamientos y no pude encontrar nada.

Notas de lanzamiento de EF 7 beta 8

Notas de lanzamiento de EF 7 RC1

Encontré ahora una publicación de uno de los desarrolladores de EF (divega) que decía esto:

En EF7 admitimos la definición de índices utilizando la API fluida pero no un atributo, al menos no todavía. El IndexAttribute al que posiblemente te refieres es algo que agregamos al paquete EF 6.x en algún momento, pero en realidad nunca se convirtió en un DataAnnotation estándar.

No queremos copiar el atributo original de EF6 como está porque hay algunas cosas en él que nos gustaría cambiar. Además, tenerlo en DataAnnotations directamente tendría más sentido que agregarlo al paquete EF7. Sin embargo, debo mencionar que es altamente improbable que agreguemos IndexAttribute en el marco de tiempo EF7 RTM.

Actualización 1

Aparentemente, esta es una característica que no se agregará a EF Core, al menos por ahora.

De la documentación de EF Core :

Los índices no se pueden configurar usando anotaciones de datos.

Pero puedes hacerlo usando Fluent Api:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasIndex(b => b.Url)
        .HasName("Index_Url");
}

Respuesta popular

En ausencia de soporte integrado, puede usar un atributo personalizado propio para anotar las propiedades del modelo y aplicar en OnModelCreating() :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var prop in entity.GetProperties())
        {
            var index = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>();
            if (index != null)
            {
                entity.AddIndex(prop);
            }
        }
    }
}

Con una clase de atributo de marcador simple:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var prop in entity.GetProperties())
        {
            var index = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>();
            if (index != null)
            {
                entity.AddIndex(prop);
            }
        }
    }
}

Luego, en su clase de modelo, simplemente agregue el atributo para crear un índice secundario:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entity in modelBuilder.Model.GetEntityTypes())
    {
        foreach (var prop in entity.GetProperties())
        {
            var index = prop.PropertyInfo.GetCustomAttribute<IndexAttribute>();
            if (index != null)
            {
                entity.AddIndex(prop);
            }
        }
    }
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué