Esecuzione della stored procedure in EntityFramework su SaveChanges ()

2

Sto utilizzando Entity Framework (prima il codice, o meglio il solo codice, il primo database) come mio DAL. Tra le altre cose è usato nel servizio WCF che inserisce alcuni nuovi dati nel database. Per la maggior parte dei casi, le prestazioni sono ok, ma alcuni degli endpoint nel servizio sono responsabli per l'importazione di grandi volumi di dati. Per questi casi sto usando StoredProcedures con il parametro SQL Table Type, e anche questo funziona bene. Il codice finisce per essere qualcosa del genere:

    public void Import(ImportItem item)
    {
        using(var tran = new TransactionScope())
        using (var dbContext = new ItemContext())
        {
            var entity = new Entity(); //Fill some values from item
            dbContext.Items.Add(entity);
            dbContext.SaveChanges();
            dbContext.ImportItemRows(item.Rows); //This executes the stored procedure and insert few thousands of rows
            tran.Complete();
        }
    }

Ciò che mi preoccupa di questo, è che ho sempre bisogno di ricordare di avvolgere questo nella transazione. Sto pensando a qualcosa di simile: quando chiamo ImportaItemRows, potrei semplicemente aggiungere la chiamata ad una lista, ed eseguirla in seguito, quando chiamerò in realtà SaveChanges ()

public class ItemContext : DbContext
{
    public ItemContext()
    {
        storedProcedures = new List<StoredProcedure>();
    }
    public virtual IDbSet<object> Items { get; set; }

    private IList<StoredProcedure> storedProcedures { get; set; }

    public void ImportItemRows(IEnumerable<object> items)
    {
        storedProcedures.Add(new ImportItemRowsStoredProcedure(items));
    }

    public override int SaveChanges()
    {
        using (var transaction = new TransactionScope())
        {
            var saveChangesResult =  base.SaveChanges();
            foreach (var sp in storedProcedures)
            {
                sp.ExecuteNonQuery(this);
            }
            transaction.Complete();
            return saveChangesResult;

        }

    }
}

Quindi potrei semplicemente usarlo come segue:

    public void Import(ImportItem item)
    {
        using (var dbContext = new ItemContext())
        {
            var entity = new Entity(); //Fill some values from item
            dbContext.Items.Add(entity);
            dbContext.ImportItemRows(item.Rows); 
            dbContext.SaveChanges();

        }
    }

C'è qualcosa di sbagliato in questo approccio? Ne vale la pena?

    
posta Botis 03.04.2015 - 13:57
fonte

0 risposte

Leggi altre domande sui tag