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!!!