Cómo especificar el nombre de la tabla con Entity Framework Code First Fluent API

86

Tengo una entidad y debo configurar Entity Framework para asignarla a una tabla de base de datos con un nombre diferente.

Puedo hacer esto fácilmente con Code First DataAnnotations ( DataAnnotations.Schema.TableAttribute ).

Pero debido a las limitaciones, ahora tengo que usar Code First Fluent API (mis objetos de dominio serán utilizados por clientes externos, por lo que no deberían ser específicos de la tecnología, por ejemplo, tener referencias a DataAnnotations)

Busqué en MSDN pero no encontré nada. Entonces, ¿es posible y cómo?

Gracias.

bairog
fuente
En general, debe crear DTO (objetos de transferencia de datos) y asignarles sus objetos EF, nunca debe usar las clases EF directamente a menos que esté trabajando en una aplicación pequeña / trivial.
reggaeguitar

Respuestas:

95

Usarás el .ToTable()método:

modelBuilder.Entity<Department>().ToTable("t_Department");   

Fuente: MSDN: http://msdn.microsoft.com/en-us/data/jj591617.aspx

Martin Cron
fuente
1
prefiero esto porque quiero todas las anotaciones en un solo lugar
rajeemcariazo
¿Existe alguna validación de que la tabla existe? cambiamos el nombre de una tabla y no se rompió nada, ¿es este el comportamiento que esperarías? obviamente no puede hacer CRUD en la tabla renombrada, pero no parece romper nada ...
AZ Chad
217

También puede utilizar la anotación de tabla:

[Table("InternalBlogs")]
public class Blog

Ver: Anotaciones de datos de Code First

Assaf S.
fuente
6
Gracias, pero si lees atentamente mi pregunta, verás esa aplicación directamente en el medio :)
bairog
2
Aunque la anotación se llama "Tabla", parece funcionar bien tanto para las vistas como para las tablas.
Jon Schneider
@JonSchneider Solo estoy discutiendo definiciones aquí sin ningún motivo en particular, pero una vista es una tabla de solo lectura.
Erik Bergstedt
La anotación de la tabla reside en System.ComponentModel.DataAnnotations.Schema ;.
Pétur Ingi Egilsson
¿Cómo ha obtenido esto más votos positivos? La pregunta claramente pide la versión api fluida
Worthy7
7

Utilice el método ToTable:

public class MyEntityMap : EntityTypeConfiguration<MyEntity>
{
    public const string TableName = "MyEntity";

    public MyEntityMap()
    {                   
        ToTable(TableName);

        Property(t => t.Id);
    }
}
alexmac
fuente
1
Creo que dividir tus asignaciones en clases es el enfoque más limpio.
SventoryMang
1
Pero luego, en su OnModelCreatingmétodo, tiene que hacer: modelBuilder.Configurations.Add(new MyEntityMap());donde en lugar de podría haber agregado un modelBuilder.Entity<MyEntity>().ToTable("MyEntityTable");no, esta no es la forma más limpia a menos que también tenga otro mapeo que hacer para esta entidad.
Serj Sagan