Come specificare la chiave univoca nel codice EF 7 prima con le annotazioni dei dati

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

Domanda

È possibile specificare una chiave univoca 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; }
}

Ma puoi farlo con Annotazioni dei dati?

modificare

I metodi cambiano in 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; }
}

Risposta accettata

Ho paura di creare un Index utilizzando l'annotazione dei dati non ancora supportato in EF 7. Controlla questo link .

Ho anche provato a trovare alcune informazioni relative a quell'argomento nelle ultime versioni e non sono riuscito a trovare nulla.

EF 7 beta 8 note di rilascio

EF 7 Note sulla versione RC1

Ho trovato ora un post da uno degli sviluppatori EF (divega) dicendo questo:

In EF7 supportiamo la definizione di indici utilizzando l'API fluente ma non un attributo, almeno non ancora. L'IndexAttribute a cui ci si sta riferendo è qualcosa che abbiamo aggiunto al pacchetto EF 6.x a un certo punto, ma non è mai diventato veramente una DataAnnotation standard.

Non vogliamo copiare l'attributo originale di EF6 perché ci sono alcune cose che vorremmo cambiare. Inoltre, averlo direttamente in DataAnnotations probabilmente avrebbe più senso che aggiungerlo al pacchetto EF7. Devo dire però che è altamente improbabile che aggiungeremo IndexAttribute nel timeframe di EF7 RTM.

Aggiornamento 1

Apparentemente questa è una funzionalità che non verrà aggiunta a EF Core, almeno per ora.

Dalla documentazione EF Core :

Gli indici non possono essere configurati utilizzando le annotazioni di dati.

Ma puoi farlo usando Fluent Api:

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

Risposta popolare

In assenza del supporto integrato, è possibile utilizzare un proprio attributo personalizzato per annotare le proprietà del modello e applicarlo in 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 semplice classe di attributo marker:

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

Quindi nella classe del modello, aggiungi l'attributo per creare un indice secondario:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché