¿Está bien declarar un DBSET en el contexto tanto para una tabla base como para una mesa derivada?
-
21-12-2019 - |
Pregunta
Tengo una tabla de Salesorder que hereda de una tabla de SalesDocument usando Tabla por tipo Herencia
Las clases de tabla (simplificadas) son;
[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; }
}
El contexto contiene
public DbSet<SalesOrder> SalesOrders { get; set; }
public DbSet<SalesDocumentHeader> SalesDocumentHeaders { get; set; }
No necesita estrictamente los Salesorders DBSET, ya que Salesorder hereda de SalesDocumentHeader, sin embargo, me parece conveniente.
Parece que funciona bien, pero me preocupa que haya 2 formas de alcanzar el mismo registro, ¿estoy haciendo algo mal?
Solución
Por lo general, solo necesita mantener el DBSET para la tabla base.Esto ayuda cuando tiene múltiples tablas derivadas (llame a A y B) y necesita decidir el tipo real dinámicamente.
Por ejemplo, si tiene otra entidad que las referencias tipo A o B (como un usuario pueden tener diferentes tipos de información de contacto), puede hacer referencia a la tabla base y la EF resolverá el tipo de concreto correcto en tiempo de ejecución.Aunque, por supuesto, esto agrega un código de fundición adicional.