In Entity Framework Core 1.0 come si rinomina gli indici?

c# entity-framework entity-framework-core

Domanda

Fino a questo punto ho permesso a EF di generare automaticamente indici e nomi di chiavi per il mio progetto, ma sfortunatamente sto iniziando a colpire il limite di caratteri in uno scenario. Fondamentalmente ho due tabelle con chiavi cluster (4 colonne) e ho bisogno di creare una tabella di ricerca tra entrambe. Una volta che lo faccio, ottengo l'errore:

"The identifier that starts with [Long FK Name Here] is too long. Maximum length is 128.

Preferibilmente in API Fluent, come posso denominare manualmente un indice di chiave esterna in Entity Framework 7 in modo che non sia FK_table2_table1_table1ID? Per esempio nel mio semplice esempio qui sotto, come potrei rinominare l'FK dalla Tabella dei titolari FK_tbl_Person_tbl_Tenant_TenantID a FK_Tenant?

inserisci la descrizione dell'immagine qui

Risposta popolare

Ho usato questo tutorial per installare EF usando VS2015:

EF - Applicazione console al nuovo database

Fondamentalmente:

  • Assicurati di utilizzare .NET Framework 4.5.1 o versioni successive.
  • Assicurati di utilizzare l'ultima versione del gestore di pacchetti nuget
  • Installa questi due pacchetti:
    • EntityFramework.MicrosoftSqlServer â € "Pre
    • EntityFramework.Commands â € "Pre

Ho creato un semplice DbContext con due entità:

using Microsoft.Data.Entity;
using System.Collections.Generic;
public class SampleContext : DbContext
{
    public DbSet<Person> People { get; set; }

    public DbSet<Tenant> Tenants { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // Visual Studio 2015 | Use the LocalDb 12 instance created by Visual Studio
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;");

        // Visual Studio 2013 | Use the LocalDb 11 instance created by Visual Studio
        // optionsBuilder.UseSqlServer(@"Server=(localdb)\v11.0;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Configure the name of the foreign key
        modelBuilder.Entity<Person>()
            .HasOne(p => p.Tenant)
            .WithMany(t => t.Persons)
            .HasConstraintName("MyForeignKey");

        // Configure the name of a unique index
        modelBuilder.Entity<Person>().HasAlternateKey(p => p.Email).ForSqlServerHasName("MyUniqueEmail");

    }
}

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual Tenant Tenant { get; set; }
}

public class Tenant
{
    public Tenant()
    {
        Persons = new HashSet<Person>();
    }

    public int TenantId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> Persons { get; set; }
}

Quindi, per configurare il nome della chiave esterna:

modelBuilder.Entity<Person>()
            .HasOne(p => p.Tenant)
            .WithMany(t => t.Persons)
            .HasConstraintName("MyForeignKey");

Per configurare il nome di un indice univoco:

modelBuilder.Entity<Person>().HasAlternateKey(p => p.Email).ForSqlServerHasName("MyUniqueEmail");

Quindi è necessario creare una migrazione per il proprio contesto utilizzando la console di Gestione pacchetti:

  • Aggiungi-Migrazione MyFirstMigration

E infine aggiorna il tuo database usando la console di Gestione pacchetti:

  • Aggiornare il database

Utilizzando Sql Server Management Studio, posso controllare il nome dei miei indici:

inserisci la descrizione dell'immagine qui




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é