Va bene dichiarare un dbset nel contesto sia per un tavolo di base che per un tavolo derivato?
-
21-12-2019 - |
Domanda
Ho una tabella dei venditori che eredita da una tabella SalesDocument utilizzando la tabella per tipo di ereditarietà
le classi di tabella (semplificate) sono;
[Table("SalesDocumentHeaders")]
public abstract class SalesDocumentHeader
{
[ForeignKey("CreatedByUserId")]
public virtual User CreatedBy { get; set; }
[Required]
public int CreatedByUserId { get; set; }
[Required]
public virtual DateTime? DocumentDate { get; set; }
[Required]
public String ReferenceNumber { get; set; }
}
[Table("SalesOrders")]
public class SalesOrder : SalesDocumentHeader
{
[Required]
public String CustomerOrderNumber { get; set; }
public DateTime? DeliverBy { get; set; }
public virtual SortableBindingList<SalesOrderLine> Lines { get; set; }
}
.
Il contesto contiene
public DbSet<SalesOrder> SalesOrders { get; set; }
public DbSet<SalesDocumentHeader> SalesDocumentHeaders { get; set; }
.
Non ha strettamente bisogno dei suddetti DBSET, poiché il venditore è eredita da SalesDocumentHeader, ma lo trovo conveniente.
Sembra funzionare bene, ma sono preoccupato che ci siano 2 modi per raggiungere lo stesso record, sto facendo qualcosa di sbagliato?
Soluzione
Di solito è necessario mantenere il DBSET per la tabella di base.Questo aiuta quando si dispone di più tabelle derivate (chiamali A e B) e devi decidere il tipo effettivo dinamicamente.
Ad esempio se si dispone di un'altra entità che i riferimenti a tipo A o B (come un utente può avere diversi tipi di informazioni di contatto), è possibile fare riferimento alla tabella di base e EF risolveranno il tipo di calcestruzzo corretto in fase di esecuzione.Anche se ovviamente questo aggiunge un codice di colata extra.