J'ai un ASP.NET MVC 6 application, et j'ai besoin d'appeler la Base de données.EnsureCreated et de la Base de données.Migrer méthodes.
Mais où dois-je les appeler?
J'ai un ASP.NET MVC 6 application, et j'ai besoin d'appeler la Base de données.EnsureCreated et de la Base de données.Migrer méthodes.
Mais où dois-je les appeler?
Je pense que c'est une question importante qui devrait être bien répondu!
Qu'est-ce que la Base de données.EnsureCreated?
context.Database.EnsureCreated()
est nouveau EF de base de la méthode qui garantit que la base de données pour le contexte. Si elle existe, aucune action n'est prise. Si elle n'existe pas, alors la base de données et l'ensemble de son schéma est créé et aussi il s'assure qu'elle est compatible avec le modèle de ce contexte.
Note:
Cette méthode ne permet pas d'utiliser les migrations pour créer la base de données. En outre, la base de données qui est créé ne peut être mis à jour en utilisant les migrations. Si vous visez une base de données relationnelle et à l'aide de migrations, vous pouvez utiliser l' DbContext.Database.Migrate()
méthode pour s'assurer de la base de données est créée et toutes les migrations sont appliquées.
Comment avons-nous le faire avec EF 6?
context.Database.EnsureCreated()
est équivalent à la liste figure ci-dessous approches de EF 6:
Le Gestionnaire De Package De La Console:
Activer-Migrations-EnableAutomaticMigrations. Ajoutez-Migration/Mise À Jour De La Base De Données.
De code:
La base de données.SetInitializer CreateDatabaseIfNotExists
ou
Avec DbMigrationsConfiguration et définir AutomaticMigrationsEnabled = true;
Qu'est-ce que la Base de données.Migrer?
S'applique en attente des migrations dans le contexte de la base de données. Créer la base de données si elle n'existe pas déjà.
Comment avons-nous le faire avec EF 6?
context.Database.Migrate()
est équivalent à la liste figure ci-dessous approches de EF 6:
Le Gestionnaire De Package De La Console:
Mise À Jour De La Base De Données -TargetMigration
Avec une coutume DbMigrationsConfiguration:
AutomaticMigrationsEnabled = false; ou avec DbMigrator.
Conclusion:
Si vous utilisez des migrations n'est - context.Database.Migrate()
. Si vous ne voulez pas migrations et veulent juste un moyen rapide de base de données (généralement pour les tests) puis utiliser le contexte.La base de données.EnsureCreated()/EnsureDeleted().
Avec les informations que James P et Bassam Alugili fourni, ce que j'ai fait a été d'ajouter ces lignes de code pour le Démarrage.cs->Configurer la méthode.
try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
.Database.Migrate();
}
}
catch (Exception e)
{
var msg = e.Message;
var stacktrace = e.StackTrace;
}
Comme un avant-propos, vous devriez lire cette de Rowan Miller:
...
EnsureCreated
totalement contourne les migrations et crée la schéma pour vous, vous ne pouvez pas mélanger cela avec les migrations.EnsureCreated
est conçu pour des tests ou de prototypage rapide où vous êtes ok avec le décrochage et la re-création de la base de données à chaque fois. Si vous utilisez les migrations et l'a appliquée automatiquement sur l'app démarrer, ensuite, vous pouvez utilisercontext.Database.Migrate()
à la place.
Selon la réponse ici, vous devez ajouter Globals.EnsureDatabaseCreated();
à Startup.cs
:
Fonction de démarrage en Démarrage.cs:
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
Configuration = builder.Build();
Globals.Configuration = Configuration;
Globals.HostingEnvironment = env;
Globals.EnsureDatabaseCreated();
}
Et de définir Globals.EnsureDatabaseCreated()
comme suit:
public static void EnsureDatabaseCreated()
{
var optionsBuilder = new DbContextOptionsBuilder();
if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:DataContext"]);
else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:DataContext"]);
else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:DataContext"]);
var context = new ApplicationContext(optionsBuilder.Options);
context.Database.EnsureCreated();
optionsBuilder = new DbContextOptionsBuilder();
if (HostingEnvironment.IsDevelopment()) optionsBuilder.UseSqlServer(Configuration["Data:dev:TransientContext"]);
else if (HostingEnvironment.IsStaging()) optionsBuilder.UseSqlServer(Configuration["Data:staging:TransientContext"]);
else if (HostingEnvironment.IsProduction()) optionsBuilder.UseSqlServer(Configuration["Data:live:TransientContext"]);
new TransientContext(optionsBuilder.Options).Database.EnsureCreated();
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.