net framework first existing example entityframework dotnet create context code asp c# asp.net-core .net-core entity-framework-core

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