问题与我的dbcontext在asp.core.不知道如何使用DbContextOptions对象

本文关键字:不知道 何使用 DbContextOptions 对象 core asp 我的 dbcontext 问题 | 更新日期: 2023-09-27 18:06:28

这是我的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; }
}

今天早些时候,我得到了一个错误,我通过放入你在代码中看到的构造函数来解决这个错误。它接受一个DbContextOptions作为参数。但是现在,当我想创建dbcontext的实例时,我不知道该在参数中放入什么:

public static async Task<List<Product>> GetAllProducts()
    {
                                              //what should go in here?
        ShoppingDbContext db = new ShoppingDbContext(?????????????);
        return await db.Products.ToListAsync();
    }

如果我创建一个重载构造函数,接受0个参数,它不会解决问题,因为它只会给我相同的错误,我之前,我用DbContextOptions参数创建构造函数。如果我在dbcontext中有一个0参数的构造函数,我得到的错误是:

没有为此DbContext配置数据库提供程序。提供程序可以通过覆盖DbContext来配置。方法或在应用程序服务提供者上使用AddDbContext。如果使用了AddDbContext,那么还要确保DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数。

问题与我的dbcontext在asp.core.不知道如何使用DbContextOptions对象

您必须在Startup.cs中设置,如下所示。

public void ConfigureServices(IServiceCollection services)
  {
    var connection = @"Server=(localdb)'mssqllocaldb;Database=MyDb;Trusted_Connection=True;";
    services.AddDbContext<ShoppingDbContext>(options => options.UseSqlServer(connection));
}

之后,你必须inject到你的Controller如下所示。

public class MyController : Controller
    {
        private ShoppingDbContext _context;
        public MyController(ShoppingDbContext context)
        {
            _context = context;
        }
}

那么你的方法是这样的:

public static async Task<List<Product>> GetAllProducts()
    {
       return await _context .Products.ToListAsync();
    }

在我的例子中,我想在我的DbFactory类中实例化一个新的上下文,而不使用DI:

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();
    }
}

尝试添加一个新的optionsBuilder,配置它并传递它,但必须有一个更好的方法