none
EF6 Redirigir consultas a un método asincrónico que consulte, devuelva y maneje excepciones de conexión. RRS feed

  • Pregunta

  • Hola, espero que me puedan aclarar lo siguiente. Estoy trabajando con una base de datos desde una aplicación WPF usando Entity Framework 6. Para manejar los errores de conexión (en caso de que cuando se ejecute una consulta no haya conexión con el servidor SQL) estoy redirigiendo todas las consultas a un método que se encargará de ejecutar la consulta, devolver el resultado y de notificar errores en la conexión en caso de existir sin lanzar una excepción (Para no tener que usar try catch cada vez que haga una consulta). Este método además lo ejecuto de forma asincrónica para que no bloquee la UI en caso de una pérdida de conexión momentanea.

    Me surge la duda de si es correcto hacerlo de la manera siguiente ya que el DbContext no es ThreadSafe

    //UI Thread
    //
    //Contexto creado en UI Thread
    EDM.IEDatabaseEntities Contexto = new EDM.IEDatabaseEntities();
    List<string> Suministradores = await App.AgenteConexion.ExecuteAsync(Contexto.EntradaTransferenciaAlmacenes.
    Select(x=>x.Suministrador).Distinct());

    //AgenteConexion.cs public async Task<List<T>> ExecuteAsync<T>(IQueryable<T> query) { return await Task.Run(() => { return Execute(query); }); } public List<T> Execute<T>(IQueryable<T> query) { try { //Intentar ejecutar la consulta, mostrar mensaje en la interfaz si esta //tardando en ejecutar la consulta para hacerle saber al usuario que se //trabajando en segundo plano return query.ToList(); } catch (System.Data.Entity.Core.EntityException) { //Excepcion atrapada, notificar al usuario que ocurrio un problema de conexion // Retornar lista vacia return new List<T>(); }

    }


    O de la siguiente manera en caso que no esté en la UI Thread

    //UI Thread
    //
    //Contexto creado en UI Thread
    Contexto = new EDM.IEDatabaseEntities();
    await Task.Run(() => {
       List<string> Suministradores = App.AgenteConexion.Execute(Contexto.EntradaTransferenciaAlmacenes.
       Select(x => x.Suministrador).Distinct(), BusyIndicator);
    })


    David Armenteros



    • Editado David Armenteros domingo, 4 de diciembre de 2016 21:36 simplificar codigo
    • Cambiado Joyce_AC lunes, 26 de diciembre de 2016 19:40
    domingo, 4 de diciembre de 2016 10:26