我在 asp.core 中的 dbcontext 有问题。不知道如何使用 DbContextOptions 对象
issue with my dbcontext in asp.core. Dont know how to use DbContextOptions object
这是我的数据库上下文:
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.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用 AddDbContext,还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象,并将其传递给 DbContext 的基本构造函数。
您必须在 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();
}
在我的例子中,我想在没有 DI 的 DbFactory class 中实例化一个新上下文:
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,配置它并通过它,但必须有更好的方法。
这是我的数据库上下文:
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.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用 AddDbContext,还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象,并将其传递给 DbContext 的基本构造函数。
您必须在 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();
}
在我的例子中,我想在没有 DI 的 DbFactory class 中实例化一个新上下文:
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,配置它并通过它,但必须有更好的方法。