¿Cómo crear dos tablas para un solo POCO usando la API fluida EF7?

c# ef-code-first entity-framework entity-framework-core

Pregunta

Quiero crear dos tablas para un solo tipo de entidad. Las tablas son similares, excepto que la segunda puede omitir algunas claves externas (por cierto, no es muy importante en el contexto de esa pregunta).

La primera tabla se usaría de una manera común (consultas de selección, consultas de inserción pequeñas, etc.).

La segunda tabla es temporal y se usaría para operaciones de inserción masiva (es decir, primero uso SqlBulkCopy para insertar datos en la tabla temporal y luego utilizo la consulta MERGE para insertar elementos en la primera tabla). Ese enfoque me permite subir miles de discos muy rápido.

Entonces, ¿cuál es la mejor manera de forzar a EF7 a crear dos tablas idénticas para la misma entidad?

Encontré una pregunta similar: use el mismo tipo contra dos tablas idénticas en el Código de EF primero, pero parece que ese tipo (el que hace la pregunta) quiere múltiples DbSets con la misma entidad. Mi caso es un poco diferente, solo quiero automatizar la creación de tablas, nada más.

Respuesta aceptada

Ok, parece que puedo responder esa pregunta yo solo.

Entonces, en realidad tengo una solución fea: usando una herencia simple puedo crear una entidad idéntica que se puede usar para crear otro DbSet en el mismo DbContext.

Además, para evitar el compromiso de la estrategia de herencia de EF, debo dejar el tipo base sin asignar (es decir, no necesito ningún cambio relacionado con la herencia en el esquema de base de datos). Ese requisito me obliga a crear una clase base (que no se asignaría) y dos herederos (uno para la tabla primaria DbSet y otro para la tabla temporal DbSet).

Ese enfoque me permite evitar el mismo problema de tipo y, lo que es más importante, me permite mantener los esquemas de tablas exactamente iguales sin ningún problema.

Ejemplo:

/// <summary>
/// Base entity, not used by EF at all - intended to define properties only.
/// </summary>
public class MyEntityBase
{
    public int Id { get; set; }
    public string Name { get; set; }
}

/// <summary>
/// That entity used to create primary table and used by app logic.
/// </summary>
public class MyEntity : MyEntityBase
{
}

/// <summary>
/// That entity used to create temp table only.
/// </summary>
public class MyTempEntity : MyEntityBase
{
}

/// <summary>
/// Here is our DB context with two DbSets...
/// </summary>
public class MyDbContext : DbContext
{
    /// <summary>
    /// That DbSet should be used by app logic.
    /// </summary>
    public DbSet<MyEntity> MyEntities { get; set; }

    /// <summary>
    /// That DbSet will force EF to create temp table.
    /// App logic shouldn't interact with it in common way 
    /// (only SqlBulkCopy and some hand-written queries) 
    /// so it is not public.
    /// </summary>
    protected DbSet<MyTempEntity> MyTempEntities { get; set; }
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué