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

时间:2016-09-11 10:30:32

标签: c# entity-framework entity-framework-core asp.net-core-1.0

这是我的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.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,那么还要确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基础构造函数。

2 个答案:

答案 0 :(得分:0)

您必须在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();
    }

然后你的方法是这样的:

SingleValueListener

答案 1 :(得分:0)

对于我来说,我想在我的 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 ,对其进行配置并通过它,但是必须有更好的方法。