Lap*_*mir 32 entity-framework entity-framework-core asp.net-core
是否有任何代码Entity Framework core
code first
在asp.net核心项目中执行自动迁移?
我只是在MVC4/5中添加
Database.SetInitializer(new MigrateDatabaseToLatestVersion<AppDbContext, MyProject.Migrations.Configuration>());
public Configuration() {
AutomaticMigrationsEnabled = true;
}
Run Code Online (Sandbox Code Playgroud)
这节省了实体更改的时间
Fra*_*oom 25
你可以打电话给context.Database.Migrate()
你Startup.cs
例如:
using (var context = new MyContext(...))
{
context.Database.Migrate();
}
Run Code Online (Sandbox Code Playgroud)
小智 15
这是他们在IdentityServer4 http://identityserver.io中执行此操作的方式
public void ConfigureServices(IServiceCollection services)
{
var connectionString = Configuration.GetConnectionString("DefaultConnection");
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// this will do the initial DB population
InitializeDatabase(app);
}
private void InitializeDatabase(IApplicationBuilder app)
{
using (var scope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
scope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.Migrate();
scope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
...
}
}
Run Code Online (Sandbox Code Playgroud)
Men*_*tor 13
EF Core不支持自动迁移.迁移是必要的创造手.要自动应用所有现有的手工迁移,需要在DbContext中添加以下代码:
public sealed class MyDbContext : DbContext
{
private static readonly bool[] _migrated = { false };
public MyDbContext( DbContextOptions<MyDbContext> options ) : base( options )
{
if ( !_migrated[0] )
lock ( _migrated )
if ( !_migrated[0] )
{
Database.Migrate(); // apply all migrations
_migrated[0] = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它不优雅,但有效.
EFCore 2.1的更新:
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<MyDbContext>();
context.Database.Migrate(); // apply all migrations
SeedData.Initialize(services); // Insert default data
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Run Code Online (Sandbox Code Playgroud)
小智 5
遵循微软的文档
https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro
如果使用依赖注入,首先需要设置一个静态类Data/DbInitializer.cs并添加以下代码:
public static class DbInitializer
{
public static void Initialize(ApplicationDbContext context)
{
context.Database.Migrate();
// Add Seed Data...
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这也是您可以添加种子数据的地方。
接下来,在您的 Program.cs 文件中,添加以下代码
public static void Main(string[] args)
{
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var environment = services.GetRequiredService<IHostingEnvironment>();
if (!environment.IsDevelopment())
{
var context = services.GetRequiredService<ApplicationDbContext>();
DbInitializer.Initialize(context);
}
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while seeding the database.");
}
}
host.Run();
}
Run Code Online (Sandbox Code Playgroud)
就我而言,我正在检查环境以确保我正在开发中,以便我可以控制迁移/更新。但是,在生产中,我希望它们能够自动进行持续集成。正如其他人所提到的,这可能不是最佳实践,但在小型项目中效果很好。
我的工作自动迁移代码 Asp Net Core 2.0.7。
// startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// configure app
SeedData.Initialize(app.ApplicationServices);
}
// dbInitializer.cs
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var serviceScope = serviceProvider.CreateScope())
{
var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();
// auto migration
context.Database.Migrate();
// Seed the database.
InitializeUserAndRoles(context);
}
}
private static void InitializeUserAndRoles(ApplicationDbContext context)
{
// init user and roles
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34630 次 |
最近记录: |