Come creare due tabelle per singolo POCO usando l'API fluente EF7?

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

Domanda

Voglio creare due tabelle per tipo di entità singola . Le tabelle sono simili, tranne la seconda possono mancare alcune chiavi esterne (btw, non è molto importante nel contesto di tale domanda).

La prima tabella verrebbe utilizzata in un modo comune (selezionare query, piccole query di inserimento e così via).

La seconda tabella è temporanea e verrebbe utilizzata per operazioni di inserimento di massa (ovvero prima utilizzo SqlBulkCopy per inserire dati nella tabella temporanea e successivamente utilizzo la query MERGE per spostare gli articoli nella prima tabella). Questo approccio mi consente di far muovere migliaia di record molto velocemente.

Quindi, qual è il modo migliore per forzare EF7 a creare due tabelle identiche per la stessa entità?

Ho trovato una domanda simile: usa lo stesso tipo contro due tabelle identiche in EF Code First Ma sembra che quel ragazzo (uno che pone la domanda) desideri più DbSet con la stessa entità. Il mio caso è leggermente diverso: voglio solo automatizzare la creazione di tabelle, niente di più.

Risposta accettata

Ok, sembra di poter rispondere a questa domanda da solo.

Quindi, in realtà ho una brutta soluzione: usando l'ereditarietà semplice posso creare entità identiche che possono essere usate per creare un altro DbSet nello stesso DbContext.

Inoltre, al fine di evitare l'impegno della strategia di ereditarietà EF, devo lasciare il tipo di base non mappato (cioè non ho bisogno di modifiche connesse all'eredità nello schema DB). Tale requisito mi obbliga a creare una classe base (che sarebbe non mappata) e due ereditari (uno per la tabella primaria DbSet e un altro per la tabella temporanea DbSet).

Questo approccio mi consente di evitare il problema dello stesso tipo e, cosa più importante, mi consente di mantenere gli schemi delle tabelle esattamente uguali senza problemi.

Esempio:

/// <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; }
}


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché