Asp.net core Connection string dinamica

di il
18 risposte

18 Risposte - Pagina 2

  • Re: Asp.net core Connection string dinamica

    Buongiorno, Allora ricapitoliamo che con questa connessione dinamica ci sto perdendo il sonno!!:

    nello startUp.cs ho messo
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddHttpContextAccessor();
                services.AddMvc();
                services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistributedCache
                services.AddSession();
    
    
                services.AddControllersWithViews();
                services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
                services.AddScoped<DatabaseFactory>();
                services.AddScoped<PagheContext>(sp => { var factory = sp.GetRequiredService<DatabaseFactory>(); return factory.GetDatabase();});
            }
    
    ho creato il DataBasefactory così
    
    using System;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Primitives;
    
    namespace paghe
    {
    
        public class DatabaseFactory
        {
            public DatabaseFactory(IServiceProvider provider, IHttpContextAccessor httpContextAccessor = null)
            {
                ServiceProvider = provider;
                HttpContextAccessor = httpContextAccessor;
            }
    
            public IServiceProvider ServiceProvider { get; private set; }
            public IHttpContextAccessor HttpContextAccessor { get; private set; }
    
            /// <summary>
            /// Torniamo il MyDatabase richiesto
            /// </summary>
            public PagheContext GetDatabase()
            {
                if (HttpContextAccessor == null) return new PagheContext("Niente http context");
                string connectionId = HttpContextAccessor.HttpContext.Session.GetString("ConCliente");
    
                switch (connectionId.ToString().ToUpper())
                {
                    case "51":
                        return new PagheContext("Server= 192.168.1.103\\SQLDACES,***; Database=db1*************;User ID=*******; Password=***;");
                    case "56":
                        return new PagheContext("Server= 192.168.1.103\\SQLDACES,***; Database=db2*************;User ID=*******; Password=***;");
                    default:
                        return new PagheContext("Server= 192.168.1.103\\SQLDACES,***; Database=db1*************;User ID=*******; Password=***;");
                }
            }
        }
    }
    
    il PagheContext
    
    using Microsoft.EntityFrameworkCore;
    using paghe.Models;
    using paghe.ViewModels;
    using Microsoft.Extensions.Configuration;
    using Microsoft.AspNetCore.Http;
    
    namespace paghe
    {
        public class PagheContext : DbContext
        {
            public PagheContext(string connectionString)
            {
                ConnectionString = connectionString;
            }
            public string ConnectionString { get; set; }
     
            public readonly IHttpContextAccessor _HttpContextAccessor;
            public PagheContext(DbContextOptions<PagheContext> options, IHttpContextAccessor HttpContextAccessor)
            : base(options)
            {
            }
    
            public DbSet<User> Users { get; set; }
            public DbSet<Dipendenti> Dipendenti { get; set; }
    }
    
    ed il PagheContextController così
    
    using Microsoft.AspNetCore.Mvc;
    
    namespace paghe.Controllers
    {
        /// Controller del database
        public class PagheContextController : Controller
        {
            public PagheContextController(PagheContext database)
            {
                MyDatabase = database;
            }
            private PagheContext MyDatabase { get; }
            public IActionResult Index()
            {
                return Ok(MyDatabase.ConnectionString);
            }
        }
    }
    
    mi hai detto che non devo creare nessun costruttore perchè il DI recupera tutti i dati quindi ho creato in un controller questa stringa
    
    using System;
    using System.Linq;
    using System.Web;
    using paghe.ViewModels;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Configuration;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Options;
    
    namespace paghe.Controllers
    {
        public class LoginUserController : Controller
        {
        private readonly PagheContext context;
        public LoginUserController(PagheContext context)
       {
          this.context = context;
        }
    
    ...
            private string IsValid(string NomeUtente, string password)
            {
                string NomeAccesso = String.Empty;
    
                    var User = context.Users.FromSqlRaw("SELECT Password, Utenti.Id, NomeUtente, Ruoli.NomeRuolo FROM Utenti INNER JOIN UtentiInRuoli ON Utenti.ID = UtentiInRuoli.IDUtente " +
                                                            "INNER JOIN Ruoli ON UtentiInRuoli.IDRuolo = Ruoli.ID WHERE(Utenti.NomeUtente = '" + NomeUtente + "')").Single();
    
                    if (User != null)
                    {
                        if (User.Password == (password))
                        {
                            NomeAccesso = User.NomeUtente;
                            HttpContext.Session.SetString("Ruolo", User.NomeRuolo);
                        }
                    }
                    return NomeAccesso;
            }
    }
    
    ma quando faccio i test mi dà questo errore
    InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider. If 'AddDbContext' is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.

    paghe.Controllers.LoginUserController.IsValid(string NomeUtente, string password) in LoginUserController.cs
    + var User = context.Users.FromSqlRaw("SELECT Password, Utenti.Id, NomeUtente, Ruoli.NomeRuolo FROM Utenti INNER JOIN UtentiInRuoli ON Utenti.ID = UtentiInRuoli.IDUtente " +
    Per quel che ho capito non trova il database configurato con dbcontext quindi le opzioni sono 4:
    1. Ho sbagliato ad inniettare il database nel controller:
        public class LoginUserController : Controller
        {
        private readonly PagheContext context;
        public LoginUserController(PagheContext context)
       {
          this.context = context;
        }
    
    ...
            private string IsValid(string NomeUtente, string password)
            {
                string NomeAccesso = String.Empty;
    
                    var User = context.Users.FromSqlRaw("SELECT Password, Utenti.Id, NomeUtente, Ruoli.NomeRuolo FROM Utenti INNER JOIN UtentiInRuoli ON Utenti.ID = UtentiInRuoli.IDUtente " +
                                                            "INNER JOIN Ruoli ON UtentiInRuoli.IDRuolo = Ruoli.ID WHERE(Utenti.NomeUtente = '" + NomeUtente + "')").Single();
    
    2. mi manca qualche pezzo di codice nel DBContext
    
    [code]
    using Microsoft.EntityFrameworkCore;
    using paghe.Models;
    using paghe.ViewModels;
    using Microsoft.Extensions.Configuration;
    using Microsoft.AspNetCore.Http;
    
    namespace paghe
    {
        public class PagheContext : DbContext
        {
            public PagheContext(string connectionString)
            {
                ConnectionString = connectionString;
            }
            public string ConnectionString { get; set; }
     
            public readonly IHttpContextAccessor _HttpContextAccessor;
            public PagheContext(DbContextOptions<PagheContext> options, IHttpContextAccessor HttpContextAccessor)
            : base(options)
            {
            }
    
            public DbSet<User> Users { get; set; }
            public DbSet<Dipendenti> Dipendenti { get; set; }
    }
    
    3. Tutti e due
    4. NON ho ancora capito nulla del DI!!!
  • Re: Asp.net core Connection string dinamica

    Invece di perdere sonno, leggi i messaggi privati

    Scherzi a parte: siccome è un argomento interessante, sto valutando l'ipotesi di fare un articolo in merito poichè parlarne così a lungo e mettere troppi spezzoni di codice nei post non è il massimo.
  • Re: Asp.net core Connection string dinamica

    Ho visto solo ora i messaggi privati!!! e ti ho risposto

    in effetti un articolo (in Italiano) non sarebbe male !
  • Re: Asp.net core Connection string dinamica

    Grazie ma purtroppo ancora non ne sono venuto a capo...
    se non ho capito male per collegare il database all' applicazione dovrei modificare
    
    using System;
    using System.Collections.Generic;
    using LearningDI.DataLayer.Models;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.AspNetCore.Http;
    
    namespace LearningDI.DataLayer.Memory
    {
    
        /// <summary>
        /// Database dei pagamenti coi dati in memoria
        /// </summary>
        public class MemoryPaymentsDb : IPaymentsDb
        {
    
            /// <summary>
            /// Crea una nuova istanza del database in memoria
            /// </summary>
            /// <param name="connectionString">Connessione da utilizzare</param>
            public MemoryPaymentsDb(string connectionString)
            {
                ConnectionString = connectionString;
            }
    
            /// <summary>
            /// Stringa di connessione da usare
            /// </summary>
            private string ConnectionString { get; }
    
            /// <summary>
            /// Elenco dei pagamenti preso in memoria
            /// </summary>
            /// <returns></returns>
    
            public IEnumerable<Payment> GetPayments()
            {
                switch (ConnectionString?.ToUpper())
                {
                    case "GELATERIACS":
                        return gelateria;
                    case "PANINOTECACS":
                        return paninoteca;
                    case "MECCANICOCS":
                        return meccanico;
                    default:
                        throw new ApplicationException("Nessun cliente selezionato");
                }
            }
                    /// <summary>
                    /// Pagamenti della gelateria
                    /// </summary>
                     private List<Payment> gelateria = new List<Payment> {
                         new Payment { Id = 1, Description = "Latte (10 confezioni)", Amount = 7.12M },
                         new Payment { Id = 2, Description = "Cioccolato in polvere (10KG)", Amount = 20.43M }
                     };
    
                    /// <summary>
                    /// Pagamenti della paninoteca
                    /// </summary>
                    private List<Payment> paninoteca = new List<Payment> {
                        new Payment { Id = 1, Description = "Pane al latte (10KG)", Amount = 12.07M },
                        new Payment { Id = 2, Description = "Prosciutto di Parma (50KG)", Amount = 230.43M }
                    };
    
                    /// <summary>
                    /// Pagamenti del meccanico
                    /// </summary>
                    private List<Payment> meccanico = new List<Payment> {
                        new Payment { Id = 1, Description = "Olio sintetico (10KG)", Amount = 123.37M },
                        new Payment { Id = 2, Description = "Liquido refrigerante (20LT)", Amount = 23.43M }
                    };
                }
            }
        }
    }
    
    con qualcosa di questo genere...
    
    using System;
    using System.Collections.Generic;
    using LearningDI.DataLayer.Models;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.AspNetCore.Http;
    
    namespace LearningDI.DataLayer.Memory
    {
    
        /// <summary>
        /// Database dei pagamenti coi dati in memoria
        /// </summary>
        public class MemoryPaymentsDb : IPaymentsDb
        {
    
            /// <summary>
            /// Crea una nuova istanza del database in memoria
            /// </summary>
            /// <param name="connectionString">Connessione da utilizzare</param>
            public MemoryPaymentsDb(string connectionString)
            {
                ConnectionString = connectionString;
            }
    
            /// <summary>
            /// Stringa di connessione da usare
            /// </summary>
            private string ConnectionString { get; }
    
            /// <summary>
            /// Elenco dei pagamenti preso in memoria
            /// </summary>
            /// <returns></returns>
    
            public Payment GetPayments()
            {
                switch (ConnectionString?.ToUpper())
                {
                    case "GELATERIACS":
                        return new Payment("Server= 192.168.1.103\\SQLDACES,49172; Database=db1;User ID=****; Password=******;");
                    case "PANINOTECACS":
                        return new Payment("Server= 192.168.1.103\\SQLDACES,49172; Database=db1;User ID=****; Password=******;");
                    case "MECCANICOCS":
                        return new Payment("Server= 192.168.1.103\\SQLDACES,49172; Database=db1;User ID=****; Password=******;");
                    default:
                        throw new ApplicationException("Nessun cliente selezionato");
                }
            }
            public DbSet<User> Users { get; set; }
            public DbSet<Dipendenti> Dipendenti { get; set; }
        }
    }
    
    ma ovviamente non funziona
    dove cavolo sbaglio ???
Devi accedere o registrarti per scrivere nel forum
18 risposte