Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework core 在web API启动类中在何处调用EF Core Migrate?_Entity Framework Core_Asp.net Core Webapi_Ef Core 3.0 - Fatal编程技术网

Entity framework core 在web API启动类中在何处调用EF Core Migrate?

Entity framework core 在web API启动类中在何处调用EF Core Migrate?,entity-framework-core,asp.net-core-webapi,ef-core-3.0,Entity Framework Core,Asp.net Core Webapi,Ef Core 3.0,我试图在Azure托管的web API中处理应用程序启动期间的数据库迁移。然而,无论我把它放在哪里,我都会得到一个例外: ObjectDisposedException:无法访问已处置的对象。 我推测这是因为我在注入过程的错误部分将上下文迁移调用包装在“using”语句中。但我不确定它应该在哪里 我查阅了以下文章: public Startup(IConfiguration appSettings) { } public void ConfigureServices(IServiceCollec

我试图在Azure托管的web API中处理应用程序启动期间的数据库迁移。然而,无论我把它放在哪里,我都会得到一个例外:

ObjectDisposedException:无法访问已处置的对象。

我推测这是因为我在注入过程的错误部分将上下文迁移调用包装在“using”语句中。但我不确定它应该在哪里

我查阅了以下文章:

public Startup(IConfiguration appSettings)
{
}
public void ConfigureServices(IServiceCollection services)
{
  services.AddDbContext<MyContext>();
  [...]
}
public void Configure(IApplicationBuilder app, 
  IWebHostEnvironment env, MyContext dbcontext)
{
  [...]
  dbcontext.Database.Migrate();
}
并尝试了以下迁移位置:

public Startup(IConfiguration appSettings)
{
  using var dbContext = new MyContext();
  dbContext.Database.Migrate();
}
这在MyContext上产生了ObjectDisposedException。因此,我尝试将其从构造函数中删除,并将其添加到服务中,然后将其注入到配置调用中(根据第一篇和第二篇文章):

公共启动(IConfiguration appSettings)
{
}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext();
[...]
}
公共无效配置(IApplicationBuilder应用程序,
IWebHostEnvironment环境,MyContext数据库上下文)
{
[...]
dbcontext.Database.Migrate();
}
这也在MyContext上产生了ObjectDisposedException。因此,我尝试更改configure方法访问上下文服务的方式(根据第三篇文章):

公共启动(IConfiguration appsettings)
{
}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext();
[...]
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
[...]
使用var serviceScope=app.ApplicationServices
.GetRequiredService()
.CreateScope();
使用var context=serviceScope.ServiceProvider
.GetService();
Migrate();
}
仍然在MyContext上生成ObjectDisposedException


如果您能帮助我理解我在尝试实现EF核心迁移时犯的错误,我将不胜感激!谢谢

如果您了解使用具有更改数据库架构权限的连接字符串的安全风险,并且了解应用程序的多个实例同时尝试迁移数据库时可能出现的问题

您可以在Program.Main中执行此操作。如果您使用的是Microsoft.Extensions.Hosting,它将如下所示:

publicstaticvoidmain(字符串[]args)
{
var host=CreateHostBuilder(args.Build();
使用(var scope=host.Services.CreateScope())
{
var db=scope.ServiceProvider.GetRequiredService();
db.Database.Migrate();
}
host.Run();
}

您还可以考虑添加一个管理页面,要求用户在单击按钮来迁移数据库之前进行身份验证。

< P>如果您了解使用具有更改权限的连接字符串的安全风险,以更改数据库模式,并且您可以理解当应用程序的多个实例尝试时可能出现的问题。同时迁移数据库

您可以在Program.Main中执行此操作。如果您使用的是Microsoft.Extensions.Hosting,它将如下所示:

publicstaticvoidmain(字符串[]args)
{
var host=CreateHostBuilder(args.Build();
使用(var scope=host.Services.CreateScope())
{
var db=scope.ServiceProvider.GetRequiredService();
db.Database.Migrate();
}
host.Run();
}

您还可以考虑添加一个管理页面,要求用户在单击按钮迁移数据库之前进行身份验证。< /P>

public Startup(IConfiguration appsettings)
{
}
public void ConfigureServices(IServiceCollection services)
{
  services.AddDbContext<MyContext>();
  [...]
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  [...]
  using var serviceScope = app.ApplicationServices
    .GetRequiredService<IServiceScopeFactory>()
    .CreateScope();
  using var context = serviceScope.ServiceProvider
    .GetService<MyDbContext>();
  context.Database.Migrate();
}