Ho sviluppato l'applicazione asp .net core wep api 2.0 con EntityFrameworkCore.SqlServer 2.0. È sviluppato utilizzando il primo approccio al database. Quando si tenta di accedere a entità che utilizzano l'applicazione dbcontext sta per interrompere la modalità. Non riesco a trovare il motivo per cui lo stato dell'applicazione si trasforma in stato di interruzione. Si prega di aiutare a risolvere questo.
Di seguito è riportato il metodo OnConfiguring nella classe DBContext.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;");
}
}
Sotto il blocco di codice utilizzato per accedere alle entità dbcontext nel controller
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
VotingAppDBContext context = new VotingAppDBContext();
var questions = context.Questions.ToList();
return new string[] { "value1", "value2" };
}
1.- Prima di tutto non dovresti creare un contesto all'interno del controller, evita di usare "nuovo" con dipendenze perché ciò renderebbe il tuo codice non testabile, nel mio caso mentre uso UnitOfWork lo inserisco come istanza IUnitOfWork che è, in effetti, un'estensione di MyConext e la inseriresti all'interno della classe StartUp ... Per fare ciò ho un metodo privato (per eseguire questa operazione in una singola chiamata privata) che assomiglia a:
private void AddEntityFrameworkAndDbContext(IServiceCollection services)
{
services.AddEntityFrameworkSqlServer();
var migrationsAssemblyName = typeof(MyContext).GetTypeInfo().Assembly.GetName().Name;
services.AddDbContext<MyContext>(options =>
{
options.UseSqlServer(
"MY CONNECTION STRING GOES HERE (BUT I RETREIVE IT FROM ANOTHER SERVICE)",
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.MigrationsAssembly(migrationsAssemblyName);
sqlOptions.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
});
},
ServiceLifetime.Scoped // Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request)
).AddUnitOfWork<MyContext>(); // This is because I'm also using EF Core Unit of work NuGet Package
}
Sto chiamando quel metodo privato da ConfigureServices (servizi IServiceCollection), come ho detto, nella classe StartUp
// Add EF, and UoW
AddEntityFrameworkAndDbContext(services);
2.- In secondo luogo ( ma direi che questo è il tuo vero problema ) Direi che ti sei perso base.OnConfiguring (opzioni); nel tuo contesto, dovrebbe essere come:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;");
}
base.OnConfiguring(optionsBuilder);
}
Inoltre, dai un'occhiata a questa risposta che ho scritto poche settimane fa: Come impostare le migrazioni EF6 con ASP.NET Core
Inoltre, quel progetto UnitOfWork merita una lettura, dai un'occhiata qui: https://github.com/arch/UnitOfWork
Spero possa essere d'aiuto,
Juan