如何在ASP.NET Core 2.0中将选项从Startup.cs传递给DbContextOptions构造函数

时间:2017-10-21 13:48:47

标签: entity-framework asp.net-core

我正在使用ASP.NET Core 2.0

在Startup.cs我有

services.AddDbContext<MailDBServicesContext>(optionsSqLite =>
        {
            optionsSqLite.UseSqlite("Data Source=Mail.db");
        });

我创建了一个模型和一个DbContext,其中DbContext是:

public class MailDBServicesContext : DbContext
{
    public MailDBServicesContext(DbContextOptions<MailDBServicesContext> options)
        : base(options)
    {

    }

    public DbSet<MailCountSentErrorMails> DbSetMailCountSentErrorMails { get; set; }
}

从类助手我需要传递DbContextOptions,我的问题是如何判断使用Startup.cs ConfigureServices方法中的选项

using (var db = new MailDBServicesContext())
                        {
                        }

1 个答案:

答案 0 :(得分:3)

例如,只需将MailDBServicesContext注入您的控制器或服务类就足够了。

public class SomeDataService
{
    private readonly MailDBServicesContext _dbContext;

    public SomeDataService(MailDBServicesContext dbContext)
    {
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
    }

    public async Task AddMailCounts()
    {
        _dbContext.DbSetMailCountSentErrorMails
            .Add(new MailCountSentErrorMails { CountSentMails = 55 });
        await _dbContext.SaveChangesAsync();
    }
}

其他数据库上下文配置选项在MSDN上的Configuring a DbContext中定义。

<强>更新

确保在DI中注册您的服务,即ConfigureServices方法。

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ISomeDataService, SomeDataService>();
    services.AddDbContext<MailDBServicesContext>(optionsSqLite =>
    {
        optionsSqLite.UseSqlite("Data Source=Mail.db");
    });

    services.AddMvc();
}

然后拨打控制器中的AddMailCounts()

public class HomeController : Controller
{
    private readonly ISomeDataService _dataService;

    public HomeController(ISomeDataService dataService)
    {
        _dataService = dataService ?? throw new ArgumentNullException(nameof(dataService));
    }

    public IActionResult Index()
    {
        _dataService.AddMailCounts();

        return View();
    }
}

现在每次加载主页时,都会在DbSetMailCountSentErrorMails表中插入一条记录。

您可以在GitHub找到有效的解决方案。