Das ist mein dbcontext:
public class ShoppingDbContext : IdentityDbContext<User>
{
public ShoppingDbContext(DbContextOptions options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
public DbSet<Product> Products { get; set; }
}
Früher habe ich einen Fehler bekommen, den ich gelöst habe, indem ich diesen Konstruktor in meinen Code eingefügt habe. Derjenige, der einen DbContextOptions als Parameter akzeptiert. Aber jetzt, wenn ich eine Instanz dieses dbcontext erstellen möchte, weiß ich nicht, was ich in diesen Parameter schreiben soll:
public static async Task<List<Product>> GetAllProducts()
{
//what should go in here?
ShoppingDbContext db = new ShoppingDbContext(?????????????);
return await db.Products.ToListAsync();
}
Wenn ich einen Überladungskonstruktor erzeuge, der 0 Parameter akzeptiert, wird das Problem nicht gelöst, weil es mir den gleichen Fehler geben würde, den ich hatte, bevor ich den Konstruktor mit dem DbContextOptions-Parameter erstellt habe. Der Fehler, den ich bekomme, wenn ich einen Konstruktor mit 0 Parametern in dbcontext habe, ist dieser:
Für diesen DbContext wurde kein Datenbankprovider konfiguriert. Ein Provider kann durch Überschreiben der DbContext.OnConfiguring-Methode oder durch Verwenden von AddDbContext für den Anwendungsdienstanbieter konfiguriert werden. Wenn AddDbContext verwendet wird, stellen Sie außerdem sicher, dass Ihr DbContext-Typ ein DbContextOptions-Objekt in seinem Konstruktor akzeptiert und an den Basiskonstruktor für DbContext übergibt.
Sie müssen das in der Startup.cs
wie unten gezeigt einstellen.
public void ConfigureServices(IServiceCollection services)
{
var connection = @"Server=(localdb)\mssqllocaldb;Database=MyDb;Trusted_Connection=True;";
services.AddDbContext<ShoppingDbContext>(options => options.UseSqlServer(connection));
}
Danach müssen Sie es in Ihren Controller
inject
, wie unten gezeigt.
public class MyController : Controller
{
private ShoppingDbContext _context;
public MyController(ShoppingDbContext context)
{
_context = context;
}
}
Dann ist deine Methode so:
public static async Task<List<Product>> GetAllProducts()
{
return await _context .Products.ToListAsync();
}
In meinem Fall möchte ich einen neuen Kontext in meiner DbFactory- Klasse ohne DI instanziieren:
public class DbFactory: Disposable, IDbFactory
{
BlogContext dbContext;
public BlogContext Init()
{
return dbContext ?? (dbContext = new BlogContext( NEEDOPTIONS ));
}
protected override void DisposeCore()
{
if (dbContext != null)
dbContext.Dispose();
}
}
Versucht, einen neuen optionsBuilder hinzuzufügen , zu konfigurieren und zu übergeben, aber es muss einen besseren Weg geben.