4
respostas

Muito confuso este OnModelCreating

Oi pessoal.

Em relação a este código:

protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder .Entity() .HasKey(pp => new { pp.PromocaoId, pp.ProdutoId });

        modelBuilder
           .Entity<Endereco>()
           .ToTable("Enderecos");

        modelBuilder
            .Entity<Endereco>()
            .Property<int>("ClienteId");

        modelBuilder
            .Entity<Endereco>()
            .HasKey("ClienteId");

    }

Só consegui entender o HasKey(chave composta), não entendi o ToTable e o Property para que servem? Não ficou claro.

Obrigada. Flávia

4 respostas

Oi, Flavia, tudo bem?

ToTable

O método ToTable() serve para indicar o nome da tabela que deseja mapear a entidade. No exemplo estamos mapeando a entidade Endereco na tabela Enderecos.

Mais detalhes aqui.

Property

O método Property() serve para criar uma shadow property, isto é uma propriedade que só existe no lado relacional. No exemplo estamos criando uma shadow property do tipo int chamada ClienteId.

Mais detalhes aqui.

HasKey

Esse método serve para indicar a chave primária, seja ela simples ou composta. No exemplo estamos indicando que a chave é simples e indexada para a shadow property ClienteId criada no código anterior.

Espero que tenha ajudado. Qualquer esclarecimento posta aqui.

Abraços.

Obrigada Daniel. No exemplo do curso para ToTable , por que houve a necessidade de mapear apenas a tabela de Enderecos? Não seria necessário o mapeamento de todas as tabelas?

Obrigada. Flávia

Flavia, o EF Core trabalha com convenções que são regras implícitas para orientar seu comportamento em determinadas situações.

A definição do nome para a tabela de determinada entidade também utiliza uma convenção, que é a seguinte: o nome da tabela será o nome da propriedade DbSet para o tipo da entidade que se quer persistir. Na ausência dessa propriedade (que é o caso de endereço) use o nome da classe, que no caso é Endereco.

Como queremos que o nome seja diferente da convenção precisamos sobrescrevê-la e uma das maneiras de fazer isso é através do método OnModelCreating(). Outra maneira é usando o atributo Table em cima do nome da classe:

[Table("Enderecos")]
public class Endereco
{
   //membros da classe aqui...
}

Mais informação aqui.

Ah sim entendi. Obrigada. No curso me perdi na classe SqlLoggerProvider pois a implementação dela não foi apresentada sendo assim não consegui escrever as querys. Talvez terei que refazer o curso, pois realmente está tudo bem confuso. De qualquer forma agradeço muito sua ajuda.

Obrigada. Flávia