4 messaggi dal 17 agosto 2012
Ho questa classe:
public class OrderDetail
{
public int OrderDetailId { get; set; }
public int OrderId { get; set; }
public int AlbumId { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public virtual Album Album { get; set; }
public virtual Order Order { get; set; }
}
Perchè alcune proprietà sono definite virtual?
3 messaggi dal 01 dicembre 2013
Se un metodo o proprietà e definito con l'attributo virtual vuol dire che può essere "overridato" da chi eredita da quella classe.
Ossia vuol dire che posso ereditando, da OrderDetail, cambiare l'implementazione di Album e Order:

class MyOrderDetail
{
public override Album Album
{
get { /* nuova implementazione */ }
set { /* nuova implementazione */ }
}
}

Per default in C# i metodi non sono virtuali quindi la loro implementazione non è modificabile tramite ereditarietà.

Aggiungo una nota. Nel tuo caso è probabile che la classe OrderDetail sia una classe di EntityFramework. In questo caso EF usa le proprietà virtuali per implementare il lazy load sfruttando il polimorfismo. In pratica EF crea al volo una classe proxy che eredita dalla tua OrderDetail e mette in quella classe proxy la logica per caricarsi leggendo i dati dal db.

Cosi quando tu carichi un OrderDetail EF non carica subito i dati dell'Album collegato, ma costruisce una classe proxy AlbumProxy che eredita da Album. Non appena tu accedi a orderDetail.Album.ProprietàDiAlbum EF effettua il caricamento effettivo dal db.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.