none
Porque colocar virtual em propriedade navegação entity framework RRS feed

  • Pergunta

  • Pessoal sou novo no entity framework, e estou estudando entity framework - code first e gostaria de saber porque que na propriedade de navegação eu tenho que colocar como virtual, a outra duvida é o seguinte antes eu montava a minha classe desse jeito:

    public class Cliente
    {
    	private int _codigo;
    	private string _nome;
    
    	
    	public int Codigo 
    	{
    		get { return _codigo;}
            	set { _codigo = value; }
    	}
    
    	public string Nome 
    	{
    		get { return _nome;
            	set { _nome = value; }
    	}
    }

    Agora eu encontro varios exemplo desse jeito:

    public class Cliente
    {
    	[Key]
    	public int Codigo {get; set;}
    
    	public string Nome {get; set;}
    }

    Porque que agora não se coloca mais os privates?

    Programando com o EF posso montar com os privates ou isso prejudica algo no EF?

    Obrigado

    terça-feira, 29 de maio de 2012 12:37

Respostas

  • Olá Rafael,

    A palavra chave Virtual quando utilizada em uma propriedade habilita o Lazy Loading. Desta forma os relacionamento são carregadas apenas quando vc carrega-las explicitamente.

    Esta pratica de utilizar um atributo privado, sendo encapsulado por suas propriedades, não é mais necessário. Este é um recurso que esta disponível desde o .Net Framwork 3.0. Quando vc cria uma propriedade sem utilizar estes atributos privados, vc esta indicando ao compilador de forma implícita que vc apenas deseja armazenar valores nessa propriedade, sem que seja necessário executar nenhum comportamento (como uma validação) é necessário no valor atribuido a propriedade.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    terça-feira, 29 de maio de 2012 12:55
    Moderador
  • O virtual serve para sobreescrever algo. Se você colocar virtual em um método por exemplo, então aquele método pode ser sobreescrito.

    No caso do entity, quando você coloca virtual, ele automaticamente faz um join(no sql) e carrega as propriedades relacionadas. Isso é conhecido como lazy loading.

    A segunda dúvida é o seguinte..

    Se você não for fazer nada dentro do get ou set, então não vejo necessidade de criar uma propriedade private, mas se você for fazer algo do tipo:

    public int Codigo{
         get
         {
             return _codigo + 50;
         }
    }
    então você precisará criar uma variavel private.

    Lembre-se que public int Codigo{get;set;} não é uma variavel mas sim métodos get e set.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 29 de maio de 2012 13:00

Todas as Respostas

  • Olá Rafael,

    A palavra chave Virtual quando utilizada em uma propriedade habilita o Lazy Loading. Desta forma os relacionamento são carregadas apenas quando vc carrega-las explicitamente.

    Esta pratica de utilizar um atributo privado, sendo encapsulado por suas propriedades, não é mais necessário. Este é um recurso que esta disponível desde o .Net Framwork 3.0. Quando vc cria uma propriedade sem utilizar estes atributos privados, vc esta indicando ao compilador de forma implícita que vc apenas deseja armazenar valores nessa propriedade, sem que seja necessário executar nenhum comportamento (como uma validação) é necessário no valor atribuido a propriedade.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    terça-feira, 29 de maio de 2012 12:55
    Moderador
  • O virtual serve para sobreescrever algo. Se você colocar virtual em um método por exemplo, então aquele método pode ser sobreescrito.

    No caso do entity, quando você coloca virtual, ele automaticamente faz um join(no sql) e carrega as propriedades relacionadas. Isso é conhecido como lazy loading.

    A segunda dúvida é o seguinte..

    Se você não for fazer nada dentro do get ou set, então não vejo necessidade de criar uma propriedade private, mas se você for fazer algo do tipo:

    public int Codigo{
         get
         {
             return _codigo + 50;
         }
    }
    então você precisará criar uma variavel private.

    Lembre-se que public int Codigo{get;set;} não é uma variavel mas sim métodos get e set.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 29 de maio de 2012 13:00
  • Sobre a propriedade virtual beleza entendi, sobre os privates isso que me impactou de primeira a forma de pensar
    terça-feira, 29 de maio de 2012 13:15
  • ahhh outra coisa no contexto o lazy load não é habilitado por padrão???? então eu to indicando q ele carregara as propriedade relacionada 2 vezes
    terça-feira, 29 de maio de 2012 13:19
  • Rafael, você declara uma propriedade sendo private quando não quer que alguem sete ou pegue o valor de qqualquer forma.

    Ou seja, você tem 3 propriedades na classe Cliente: Nome, Sobrenome e NomeCompleto.

    Toda vez que você chamar a NomeCompleto, você quer que o resultado seja o Nome + Sobrenome.

    Como você faria isso sem usar métodos supondo que o nome do cliente pode mudar a qualquer momento? Você teria que setar o NomeCompleto toda vez que nome ou sobrenome fosse alterado.

    Portanto você pode criar métodos que façam isso pra você:

    public string NomeCompleto{
         get
         {
              return Nome + Sobrenome;
         }
         private set;
    }

    Assim você poderia mudar a propriedade nome e a propriedade sobrenome sem se preocupar em mudar a NomeCompleto.

    E como você não quer que alguem sete algo diretamente na NomeCompleto, você simplesmente deixa ela como private


    http://www.linkedin.com/pub/murilo-kunze/44/191/455


    • Editado Murilo Kunze terça-feira, 29 de maio de 2012 13:33
    terça-feira, 29 de maio de 2012 13:30
  • O lazy loading vem como padrão mas só para propriedades com virtual eu acho.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455


    • Editado Murilo Kunze terça-feira, 29 de maio de 2012 13:32
    terça-feira, 29 de maio de 2012 13:31
  • Pessoal obrigado pelas resposta me ajudaram bastante

    terça-feira, 29 de maio de 2012 13:35