c# - first - net core entity framework existing database
Cómo crear una instancia de un DbContext en EF Core (3)
Instalar nuevo objeto de DbContext desde ConnectionString
var connectionstring = "Connection string";
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(connectionstring);
ApplicationDbContext dbContext = new ApplicationDbContext(optionsBuilder.Options);
He configurado .net core project y db context también. Pero no puedo empezar a usar dbContext todavía debido a este error
"no hay un argumento dado que corresponda al parámetro formal requerido ''opciones''"
Controlador:
public IActionResult Index()
{
using (var db = new BlexzWebDb())
{
}
return View();
}
Código dbcontext:
public class BlexzWebDb : DbContext
{
public BlexzWebDb(DbContextOptions<BlexzWebDb> options)
: base(options)
{ }
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<AssignedRole> AssignedRoles { get; set; }
}
imagen de error adjunta. ¿Cuál es la posible solución para ese problema? Gracias por adelantado
Además de la respuesta de @ Stefan, hay otra forma de lograrlo. Puede configurar la cadena de conexión db en el método OnConfiguring de la clase DbContext sin agregar el servicio DbContext en startup.cs.
Setting.cs
public static class Setting
{
public static string ConnectionString { get; set; }
}
Startup.cs
Setting.ConnectionString = Configuration.GetSection("ConnectionStrings:BlexzDbConnection").Value;
BlexzWebDb.cs
public class BlexzWebDb : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(Setting.ConnectionString);
}
}
}
HomeController.cs
public class HomeController : Controller
{
private readonly BlexzWebDb db;
public HomeController()
{
this.db = new BlexzWebDb();
}
//etc.
En EF Core es común pasar algunas DbContextOptions al constructor.
Entonces, en general, un constructor se ve así:
public BlexzWebDb(DbContextOptions<BlexzWebDb> options) : base(options)
Como puede ver, no hay una sobrecarga válida en la forma de un constructor sin parámetros:
Por lo tanto, esto no funciona:
using (var db = new BlexzWebDb())
En lugar
.Net Core ha implementado IoC en sus raíces. Está bien, esto significa; usted no crea un contexto, le pide al marco que le dé uno basado en algunas reglas que definió anteriormente.
Ejemplo: en algún lugar registrará su dbcontext, (Startup.cs):
//typical configuration part of .net core
public void ConfigureServices(IServiceCollection services)
{
//some mvc
services.AddMvc();
//hey, options!
services.AddDbContextPool<BlexzWebDb>(options =>
options.UseSqlServer(Configuration.GetConnectionString("BlexzWebConnection")));
//...etc
Ahora que la parte de registro está lista, puede recuperar su contexto desde el marco. Ej .: inversión de control a través de un constructor en su controlador:
public class SomeController : Controller
{
private readonly BlexzWebDb _db;
//the framework handles this
public SomeController(BlexzWebDb db)
{
_db = db;
}
//etc.
actualizar
En estos días, el método preferido para agregar un DbContext a la colección de servicios es usar el método
AddDbContextPool
:
//hey, options!
//hey, DbContextPool
services.AddDbContextPool<BlexzWebDb>(options =>
options.UseSqlServer(Configuration.GetConnectionString("BlexzWebConnection")));
//etc
Para más información, ver msdn