J'ai un effet amusant en utilisant la migration (EF 5.0) et le code en premier:
J'ai créé des modèles avec GUID clés primaires. (BTW: Il est important pour moi que SQL Server utilise NEWSEQUENTIALID()
, ce qui semble être la valeur par défaut de la version actuelle)
À un moment donné, j'ai activé les migrations. J'ai ajouté du code à la migration initiale, il s'agit principalement de .Index()
selon les besoins.
Lorsque je supprime la base de données et que j'appelle update-database, le message d'erreur suivant s'affiche:
Impossible de mettre à jour la base de données pour correspondre au modèle actuel car des modifications sont en attente et la migration automatique est désactivée. Écrivez les modifications de modèle en attente dans une migration basée sur un code ou activez la migration automatique. Définissez DbMigrationsConfiguration.AutomaticMigrationsEnabled sur true pour activer la migration automatique. Vous pouvez utiliser la commande Add-Migration pour écrire les modifications de modèle en attente dans une migration basée sur un code.
J'ai essayé AutomaticMigrationsEnabled = true
, qui a fonctionné sans rien changer ni rien ajouter!
Mais comme je ne veux pas de AutomaticMigrationsEnabled
, j’ai également essayé de supprimer à nouveau la base de données, appelée update-database
puis add-migration
. Je me suis retrouvé avec une migration supplémentaire qui semble ne rien changer (voir ci-dessous). J'ai également essayé d'ajouter ces lignes au bas de la migration initiale - mais cela ne change rien.
Un des modèles:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
Le code de migration initial:
public partial class InitialCreate : DbMigration
{
public override void Up()
{
// [...]
CreateTable(
"dbo.Speaker",
c => new
{
Id = c.Guid(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, true, false); // added manually: unique Name
// [...]
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyProject.Repositories.DBContext context)
{
// ...
}
}
Ci-dessous, le code créé par add-migration: Il ne semble rien faire de nouveau - peut-être qu'il me manque quelque chose?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
Je suis donc curieux: qu’ai-je fait pour désorienter les migrations? Et que puis-je faire pour que cela fonctionne avec une seule migration initiale?
Solution : La solution de contournement suivante l'a fait pour moi:
J'ai également essayé à nouveau de supprimer la base de données, appelée update-database puis add-migration. Je me suis retrouvé avec une migration supplémentaire qui semble ne rien changer (voir ci-dessous)
Sur la base des détails ci-dessus, je pense que vous avez fait la dernière chose en premier. Si vous exécutez Update database
avant Add-migration
, la base de données ne sera pas mise à jour avec vos schémas de migration. Vous devez d’abord ajouter la migration, puis exécuter la commande update.
Essayez-les dans cet ordre en utilisant la console du gestionnaire de paquets.
PM> Enable-migrations //You don't need this as you have already done it
PM> Add-migration Give_it_a_name
PM> Update-database
Entity Framework a quelques problèmes autour des champs d'identité.
Vous ne pouvez pas ajouter GUID identité sur une table existante
Migrations: ne détecte pas les modifications apportées à DatabaseGeneratedOption
Aucune de celles-ci ne décrit votre problème avec précision et la méthode Down () de votre migration supplémentaire est intéressante, car elle semble tenter de supprimer IDENTITY de la colonne lorsque votre CREATE TABLE dans la migration initiale semble le définir!
De plus, si vous utilisez Update-Database -Script
ou Update-Database -Verbose
pour afficher le sql exécuté à partir de ces méthodes AlterColumn
, vous verrez que celui-ci est identique dans Up
et Down
et ne fait rien. IDENTITY reste inchangé (pour la version actuelle - EF 6.0.2 et inférieure) - comme décrit dans les 2 premiers numéros auxquels j'ai lié.
Je pense que vous devriez supprimer le code redondant de votre migration supplémentaire et vivre avec une migration vide pour le moment. Et vous pouvez vous inscrire/voter pour les problèmes à traiter.
Références:
l'option Change IDENTITY ne s'accroupit pas
Activer/désactiver l'identité avec une opération de migration personnalisée
Essaye ça:
PM> Enable-migrations -force
PM> Add-migration MigrationName
PM> Update-database -force
pour moi, je l'ai résolu comme suit: Dans Visual Studio 2015: dans le menu Affichage, cliquez sur Autres fenêtres, puis sur Console du gestionnaire de packages, puis exécutez les commandes suivantes:
PM> enable-migrations
Les migrations ont déjà été activées dans le projet 'mvcproject'. Pour écraser la configuration de migration existante, utilisez le paramètre -Force.
PM> enable-migrations -Force
Vérification si le contexte cible une base de données existante ... Migration de code d'abord activée pour le projet mvcproject.
puis ajoutez le nom de la migration dans le dossier de migration, il ajoutera la classe dont vous avez besoin dans l'Explorateur de solutions en exécutant la commande suivante
PM>Add-migration AddColumnUser
Enfin mettre à jour la base de données
PM> update-database
Lorsque vous utilisez VS2019, MVC5 - recherchez le fichier Configuration.cs dans le dossier Migrations. Modifier: AutomaticMigrationsEnabled = true