En Entity Framework Core 1.0, ¿cómo cambiar el nombre de los índices?

c# entity-framework entity-framework-core

Pregunta

Hasta este punto, he permitido a EF generar automáticamente índices y nombres de clave para mi proyecto, pero desafortunadamente, estoy empezando a alcanzar el límite de caracteres en un escenario. Básicamente tengo dos tablas con claves agrupadas (4 columnas) y necesito crear una tabla de búsqueda entre ambas. Una vez que hago eso, me sale el error:

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

Preferiblemente en Fluent API, ¿cómo puedo nombrar manualmente un índice de clave externa en Entity Framework 7 para que no sea FK_table2_table1_table1ID? Por ejemplo, en mi sencillo ejemplo a continuación, ¿cómo cambiaría el nombre de FK de la tabla de arrendatarios FK_tbl_Person_tbl_Tenant_TenantID a FK_Tenant?

introduzca la descripción de la imagen aquí

Respuesta popular

He usado este tutorial para instalar EF utilizando VS2015:

EF - Aplicación de consola a la nueva base de datos

Básicamente:

  • Asegúrese de que está apuntando a .NET Framework 4.5.1 o posterior.
  • Asegúrese de que está utilizando la última versión del gestor de paquetes nuget
  • Instale estos dos paquetes:
    • EntityFramework.MicrosoftSqlServer - Pre
    • EntityFramework.Commands - Pre

He creado un simple DbContext con dos entidades:

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

Para configurar el nombre de la clave foránea:

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

Para configurar el nombre de un índice único:

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

Luego, debe crear una migración para su contexto utilizando la Consola del administrador de paquetes:

  • Add-Migration MyFirstMigration

Y finalmente, actualice su base de datos utilizando la Consola del administrador de paquetes:

  • Actualizar base de datos

Usando Sql Server Management Studio, puedo verificar el nombre de mis índices:

introduzca la descripción de la imagen aquí



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é