Como especificar o nome da tabela com a API Entity Framework Code First Fluent

86

Eu tenho uma entidade e devo configurar o Entity Framework para mapeá-la para uma tabela de banco de dados com nome diferente.

Posso fazer isso facilmente com Code First DataAnnotations ( DataAnnotations.Schema.TableAttribute ).

Mas, devido a limitações, agora tenho que usar a API Code First Fluent (meus objetos de domínio serão usados ​​por clientes externos, então eles não devem ser específicos de tecnologia - por exemplo, ter qualquer referência a DataAnnotations)

Eu pesquisei no MSDN, mas não encontrei nada. Então, é possível e como?

Obrigado.

bairog
fonte
Em geral, você deve criar DTOs (objetos de transferência de dados) e mapear seus objetos EF para eles; nunca deve usar as classes EF diretamente, a menos que esteja trabalhando em um aplicativo pequeno / trivial.
reggaeguitar

Respostas:

95

Você usará o .ToTable()método:

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

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

Martin Cron
fonte
1
eu prefiro isso porque eu quero todas as anotações em um só lugar
rajeemcariazo
existe alguma validação de que a tabela existe? renomeamos uma tabela e nada quebrou, é esse o comportamento que você esperava? obviamente não pode fazer CRUD na tabela renomeada, mas não parece quebrar nada ...
AZ Chad
217

Você também pode usar a anotação Tabela:

[Table("InternalBlogs")]
public class Blog

Consulte: Anotações de dados do código inicial

Assaf S.
fonte
6
Thx, mas se você ler atentamente minha pergunta - você verá aquele apptoach diretamente no meio dela :)
bairog
2
Mesmo que a anotação seja chamada de "Tabela", ela parece funcionar bem para visualizações e também para tabelas.
Jon Schneider
@JonSchneider Estou apenas discutindo definições aqui sem nenhuma razão em particular, mas uma visão é uma tabela somente leitura.
Erik Bergstedt
A anotação da Tabela reside em System.ComponentModel.DataAnnotations.Schema ;.
Pétur Ingi Egilsson
Como isso obteve mais votos positivos, a pergunta claramente pede a versão API fluente
Worthy7,
7

Use o método ToTable:

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

    public MyEntityMap()
    {                   
        ToTable(TableName);

        Property(t => t.Id);
    }
}
alexmac
fonte
1
Acho que dividir seus mapeamentos em classes é a abordagem mais limpa.
SventoryMang
1
Mas então, em seu OnModelCreatingmétodo, você tem que fazer: modelBuilder.Configurations.Add(new MyEntityMap());onde, em vez de apenas adicionar um modelBuilder.Entity<MyEntity>().ToTable("MyEntityTable");, não, essa não é a maneira mais limpa, a menos que você também tenha outro mapeamento para fazer para essa entidade.
Serj Sagan