在asp.core中我的dbcontext問題。不知道如何使用DbContextOptions對象

asp.net-core-1.0 c# entity-framework entity-framework-core

這是我的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的基礎構造函數。

一般承認的答案

你必須在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類中實例化一個新的上下文:

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 ,配置它並傳遞它,但必須有一個更好的方法。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow