c# - entity framework public virtual




Por que usar 'virtual' para propriedades de classe nas definições de modelo do Entity Framework? (4)

É muito comum definir as propriedades de navegação em um modelo como virtuais. Quando uma propriedade de navegação é definida como virtual, ela pode aproveitar certas funcionalidades do Entity Framework. O mais comum é o carregamento lento.

Carregamento preguiçoso é um recurso interessante de muitos ORMs porque permite acessar dinamicamente dados relacionados de um modelo. Ele não buscará os dados relacionados desnecessariamente até que seja realmente acessado, reduzindo assim a consulta inicial dos dados do banco de dados.

Do livro "ASP.NET MVC 5 com Bootstrap e Knockout.js"

No seguinte blog: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

O blog contém o seguinte exemplo de código:

public class Dinner
{
   public int DinnerID { get; set; }
   public string Title { get; set; }
   public DateTime EventDate { get; set; }
   public string Address { get; set; }
   public string HostedBy { get; set; }
   public virtual ICollection<RSVP> RSVPs { get; set; }
}

public class RSVP
{
   public int RsvpID { get; set; }
   public int DinnerID { get; set; }
   public string AttendeeEmail { get; set; }
   public virtual Dinner Dinner { get; set; }
}

Qual é o propósito de usar o virtual ao definir uma propriedade em uma classe? Que efeito isso tem?


A palavra-chave virtual em C # permite que um método ou propriedade seja substituído por classes filhas. Para mais informações, consulte a documentação do MSDN sobre a palavra-chave 'virtual'

ATUALIZAÇÃO: Isso não responde à pergunta como é feita atualmente, mas deixarei aqui para quem procura uma resposta simples à pergunta não descritiva original feita.


Eu entendo a frustração dos OPs, este uso do virtual não é para a abstração modelada que o modificador virtual defacto é efetivo.

Se algum ainda estiver lutando com isso, eu ofereço meu ponto de vista, enquanto tento manter as soluções simples e o jargão ao mínimo:

O Entity Framework em uma peça simples utiliza carregamento lento, o que equivale a preparar algo para execução futura. Isso se encaixa no modificador 'virtual', mas há mais nisso.

No Entity Framework, o uso de uma propriedade de navegação virtual permite denotá-lo como o equivalente a uma chave estrangeira anulável no SQL. Você não precisa aderir a todas as tabelas com chave ao realizar uma consulta, mas quando precisar delas, elas se tornam orientadas pela demanda.

Também mencionei nullable porque muitas propriedades de navegação não são relevantes no início. Por exemplo, em um cenário de pedidos / cliente, você não precisa esperar até o momento em que um pedido é processado para criar um cliente. Você pode, mas se tivesse um processo em vários estágios para conseguir isso, talvez fosse necessário persistir os dados do cliente para uma conclusão posterior ou para implantação em pedidos futuros. Se todas as propriedades de navegação fossem implementadas, você teria que estabelecer cada chave estrangeira e campo relacional no salvamento. Isso realmente apenas coloca os dados de volta na memória, o que anula o papel da persistência.

Assim, embora possa parecer enigmático na execução real em tempo de execução, descobri que a melhor regra prática a ser usada seria: se você estiver transmitindo dados (lendo em um Modelo de Visualização ou Modelo Serializável) e precisar de valores antes das referências, não use virtual; Se o seu escopo estiver coletando dados que podem estar incompletos ou uma necessidade de pesquisar e não exigir que todos os parâmetros de pesquisa sejam concluídos para uma pesquisa, o código fará bom uso da referência, semelhante ao uso de propriedades de valor anuláveis ​​int? longo?. Além disso, abstrair sua lógica de negócios de sua coleta de dados até a necessidade de injetá-la tem muitos benefícios de desempenho, como instanciar um objeto e iniciá-lo em null. O Entity Framework usa muita reflexão e dinâmica, o que pode degradar o desempenho, e a necessidade de ter um modelo flexível que possa escalar para a demanda é fundamental para gerenciar o desempenho.

Para mim, isso sempre fazia mais sentido do que usar um jargão técnico sobrecarregado, como proxies, delegados, manipuladores e tal. Uma vez que você atingiu a terceira ou quarta programação, pode ficar confuso com isso.


No contexto da EF, marcar uma propriedade como virtual permite que a EF use o carregamento lento para carregá-la. Para que o carregamento ocioso funcione, a EF precisa criar um objeto proxy que substitua suas propriedades virtuais por uma implementação que carregue a entidade referenciada quando for acessada pela primeira vez. Se você não marcar a propriedade como virtual, o carregamento lento não funcionará com ela.





virtual