Il y a déjà un objet nommé dans la base de données

115

La mise à jour de la base de données a échoué à partir de la console du gestionnaire de package. J'ai utilisé Entity Framework 6.x et l'approche code-first. L'erreur est

"Il existe déjà un objet nommé 'AboutUs' dans la base de données."

Comment puis-je résoudre ce problème?

internal sealed class Configuration 
    : DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
    {

    }
}

Mon DbContext est:

public class JahanBlogDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
    public JahanBlogDbContext()
        : base("name=JahanBlogDbConnectionString")
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<JahanBlogDbContext>());
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Comment>().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
    }

    public virtual DbSet<Article> Articles { get; set; }
    public virtual DbSet<ArticleLike> ArticleLikes { get; set; }
    public virtual DbSet<ArticleTag> ArticleTags { get; set; }
    public virtual DbSet<AttachmentFile> AttachmentFiles { get; set; }
    public virtual DbSet<Comment> Comments { get; set; }
    public virtual DbSet<CommentLike> CommentLikes { get; set; }
    public virtual DbSet<CommentReply> CommentReplies { get; set; }
    public virtual DbSet<ContactUs> ContactUs { get; set; }
    public virtual DbSet<Project> Projects { get; set; }
    public virtual DbSet<ProjectState> ProjectStates { get; set; }
    public virtual DbSet<ProjectTag> ProjectTags { get; set; }
    public virtual DbSet<Rating> Ratings { get; set; }
    public virtual DbSet<Tag> Tags { get; set; }
    public virtual DbSet<AboutUs> AboutUs { get; set; }
}

Console de gestion des packages:

PM> update-database -verbose -force
Using StartUp project 'Jahan.Blog.Web.Mvc'.
Using NuGet project 'Jahan.Blog.Web.Mvc'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'Jahan-Blog' (DataSource: (local), Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201410101740197_AutomaticMigration.
CREATE TABLE [dbo].[AboutUs] (
    [Id] [int] NOT NULL IDENTITY,
    [Description] [nvarchar](max),
    [IsActive] [bit] NOT NULL,
    [CreatedDate] [datetime],
    [ModifiedDate] [datetime],
    CONSTRAINT [PK_dbo.AboutUs] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AboutUs' in the database.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
   at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
   at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
   at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:88b66414-8776-45cd-a211-e81b2711c94b
There is already an object named 'AboutUs' in the database.
PM> 
Dit Roohullah Allem
la source
Comment puis-je le faire (mise en correspondance avec la conception existante)?
Dit Roohullah Allem
15
@HLGEM, Si une "base de données bien conçue" peut être mappée à un modèle d'objet à l'aide d'EF, EF peut également la générer. Les migrations de bases de données sont un outil puissant qui facilite le déploiement de votre base de données. Je ne recommanderais pas d'éviter d'utiliser les migrations DB. Sinon, des scripts de patch sont nécessaires de toute façon. Je recommanderais d'utiliser correctement les migrations DB.
Ilya Palkin

Réponses:

129

il semble qu'il y ait un problème dans le processus de migration, exécutez la commande add-migration dans "Package Manager Console":

Add-Migration Initial -IgnoreChanges

effectuez quelques modifications, puis mettez à jour la base de données à partir du fichier "Initial":

Update-Database -verbose

Edit: -IgnoreChanges est dans EF6 mais pas dans EF Core, voici une solution de contournement: https://stackoverflow.com/a/43687656/495455

Sina Amirshekari
la source
8
Qu'est-ce que cela fait exactement? Cela permet-il au nouveau modèle de simplement écraser l'ancien?
Travis Tubbs
1
J'ai commencé à utiliser des migrations manuelles car j'utilise des vues ainsi que des tables dans ma base de données. J'ai fait l'erreur d'essayer d'utiliser des migrations automatiques et, par conséquent, j'ai essayé de créer une table à partir d'une vue. Dans ce scénario, votre solution ne fonctionne pas, je devrais à la place toujours utiliser des migrations manuelles. Donc, après avoir fait cela, j'ai dû annuler les modifications du contrôle de code source et supprimer l'entrée "Initial" de la table _Migrations.
arame3333
3
Cela me conduit juste dans une boucle infinie: la console du gestionnaire de packages ne me laissera pas faire Add-Migration car elle donne une erreur "Impossible de générer une migration explicite car les migrations explicites suivantes sont en attente ..." à savoir InitialCreate. Mais si je ne peux pas exécuter avec succès cette base de données de mise à jour JUSQU'À ce qu'il y ait aussi des changements initiaux, que suis-je censé faire
East of Nowhere
6
Add-Migration: Impossible de trouver un paramètre correspondant au nom de paramètre «IgnoreChanges».
Tzvi Gregory Kaidanov
3
@TravisTubbs cela ignore les modifications que vous avez apportées et «simule» que votre modèle est synchronisé avec la base de données, en ce qui concerne la table de migration. Vous devez toujours synchroniser manuellement les deux; Dans mon cas, j'ai supprimé les modifications apportées au modèle, effectué une migration supplémentaire, supprimé le contenu des méthodes up / down avant de faire update-database - cela m'a renvoyé à l'état avant la migration interrompue. Ensuite, j'ai ré-ajouté les modifications, fait add-migration et update-database comme d'habitude - cette fois, tout est synchronisé
David Refaeli
73

Peut-être avez-vous changé l'espace de noms dans votre projet!
Il y a une table dans votre base de données appelée dbo.__MigrationHistory. La table a une colonne appelée ContextKey.
La valeur de cette colonne est basée sur votre namespace. par exemple est " DataAccess.Migrations.Configuration".
Lorsque vous modifiez l'espace de noms, cela provoque des noms de table en double avec des espaces de noms différents.
Ainsi, après avoir modifié l'espace de noms côté code, modifiez également l'espace de noms dans cette table dans la base de données (pour toutes les lignes).
Par exemple, si vous modifiez l'espace de noms en EFDataAccess, vous devez modifier les valeurs de la ContextKeycolonne en dbo.__MigrationHistory" EFDataAccess.Migrations.Configuration".
Puis côté code, dans Tools => Package Manager Console, utilisez la update-databasecommande.

Une autre option au lieu de modifier la valeur de contexte dans la base de données consiste à coder en dur la valeur de contexte dans votre code avec l'ancienne valeur d'espace de noms. Ceci est possible en héritant DbMigrationsConfiguration<YourDbContext>et dans le constructeur, affectez simplement l'ancienne valeur de contexte à ContextKey, puis héritez MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>et laissez cette classe vide. La dernière chose à faire est d'appeler Database.SetInitializer(new YourDbInitializer());votre DbContext dans un constructeur statique.

J'espère que votre problème sera résolu.

Elnaz
la source
9
Génial, nous avons eu exactement ce problème!
Olivier ROMAND
3
En fait, c'est la vraie cause de cette erreur. EF essaie de créer une base de données car il ne peut pas lire les migrations qui sont appliquées à la base de données en raison de la différence de nameSpace
UfukSURMEN
Merci cette réponse, m'a beaucoup aidé, comme le disait Olivier ROMAND, j'avais exactement ce problème!
Enrique A. Pinelo Novelo
Je n'avais aucune idée que c'était lié à cela, mais d'une manière ou d'une autre, même la suppression des enregistrements de la MigrationHistorytable ne l'a pas résolu pour moi ... j'ai donc laissé tomber toutes mes tables et laissé EF les créer toutes à nouveau, petite application, pas de gros problème. ..mais ça l'a corrigé pour moi.
Niklas
C'est la bonne réponse avec des détails, il est également bon de mentionner que parfois une faute d'orthographe du nom du dossier causera ce problème.
H35am
17

"Il existe déjà un objet nommé 'AboutUs' dans la base de données."

Cette exception vous indique que quelqu'un a déjà ajouté un objet nommé «AboutUs» à la base de données.

AutomaticMigrationsEnabled = true;peut y conduire puisque les versions de base de données ne sont pas contrôlées par vous dans ce cas. Afin d'éviter les migrations imprévisibles et assurez-vous que chaque développeur de l'équipe travaille avec la même structure de base de données que je vous suggère de définirAutomaticMigrationsEnabled = false; .

Les migrations automatiques et les migrations codées peuvent coexister si vous êtes très prudent et que vous êtes le seul développeur sur un projet.

Il y a une citation de la publication Automatic Code First Migrations sur Data Developer Center :

Les migrations automatiques vous permettent d'utiliser les migrations Code First sans avoir un fichier de code dans votre projet pour chaque modification que vous apportez. Toutes les modifications ne peuvent pas être appliquées automatiquement - par exemple, les changements de nom de colonne nécessitent l'utilisation d'une migration basée sur le code.

Recommandation pour les environnements d'équipe

Vous pouvez entremêler les migrations automatiques et basées sur le code, mais cela n'est pas recommandé dans les scénarios de développement d'équipe. Si vous faites partie d'une équipe de développeurs qui utilisent le contrôle de code source, vous devez soit utiliser des migrations purement automatiques, soit des migrations purement basées sur du code. Compte tenu des limitations des migrations automatiques, nous vous recommandons d'utiliser des migrations basées sur du code dans les environnements d'équipe.

Ilya Palkin
la source
12

Dans mon cas, ma EFMigrationsHistorytable était vidée (d'une manière ou d'une autre) et en essayant de courir update-database, j'obtenais:

Il y a déjà un objet nommé 'AspNetUsers' dans la base de données

Après avoir vu que la table avait été vidée, il était logique d'essayer de réexécuter la migration initiale et d'essayer de recréer les tables.

Pour résoudre ce problème, j'ai ajouté des lignes dans ma EFMigrationsHistorytable. 1 ligne pour chaque migration dont je savais que la base de données était à jour.

Une ligne aura 2 colonnes: MigrationIdetProductVersion

MigrationIdest le nom de votre fichier de migration. Exemple:20170628112345_Initial

ProductVersionest la version ef que vous utilisez. Vous pouvez le trouver en tapant Get-Packagedans la console du gestionnaire de packages et en recherchant votre package ef.

J'espère que cela est utile pour quelqu'un.

Kolby
la source
1
Comment avez-vous rempli la colonne Modèle?
Ciaran Gallagher
7

Dans mon cas, j'avais renommé l'assembly qui contenait le modèle de cadre d'entité code-first. Bien que le schéma réel n'ait pas du tout changé, la table des migrations appelée

dbo.__MigrationHistory

contient une liste des migrations déjà effectuées en fonction de l' ancien nom d'assembly. J'ai mis à jour l'ancien nom dans le tableau des migrations pour correspondre au nouveau et la migration a ensuite fonctionné à nouveau.

Le sénateur
la source
5

Assurez-vous que votre projet de démarrage de solutions a la chaîne de connexion correcte dans le fichier de configuration. Ou définissez le paramètre -StartUpProjectName lors de l'exécution de la commande update-database. Le paramètre -StartUpProjectName spécifie le fichier de configuration à utiliser pour les chaînes de connexion nommées. S'il est omis, le fichier de configuration du projet spécifié est utilisé.

Voici un lien pour les références de commande ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/

Ryan Layton
la source
Cette réponse m'a conduit à mon erreur, j'avais simplement le mauvais projet en tant que projet de démarrage.
Martin Johansson
J'avais un problème similaire et cela l'a résolu pour moi.
JordanTDN
3

J'ai eu le même problème et après trois heures de lutte, je découvre ce qui se passe

Dans mon cas, lorsque j'ai voulu migrer pour la première fois en up()méthode, le code par défaut veut créer les tables qui existaient déjà donc j'ai la même erreur que vous

Pour le résoudre, supprimez simplement ce code et écrivez ce que vous voulez. Par exemple, je voulais ajouter une colonne donc j'écris juste

migrationBuilder.AddColumn<string>(
            name: "fieldName",
            table: "tableName",
            nullable: true);
arfa
la source
Cela semble être une bonne réponse, mais vous voudrez peut-être vérifier votre orthographe. Vous pouvez également utiliser des extraits de code pour indiquer clairement que la dernière ligne est le code. Envoyez-moi un message si vous voulez de l'aide.
Mike Poole
Merci Comment puis-je vous masser
arfa
1
Bravo pour l'ajout de l'extrait de code @arfa. Pas besoin de massage :). Si vous souhaitez m'envoyer un message, tapez simplement @suivi de mon nom d'utilisateur dans la section commentaires.
Mike Poole
3

Remarque: solution non recommandée. mais solution rapide dans certains cas.

Pour moi, dbo._MigrationHistorydans la base de données de production, les enregistrements de migration manqués pendant le processus de publication, mais la base de données de développement contenait tous les enregistrements de migration.

Si vous êtes sûr que la base de données de production a un schéma identique et le plus récent par rapport à la base de données de développement, la copie de tous les enregistrements de migration vers la base de données de production peut résoudre le problème.

Vous pouvez le faire uniquement avec VisualStudio.

  1. Ouvrez le panneau 'Explorateur d'objets SQL Server'> cliquez avec dbo._MigrationHistoryle bouton droit sur la table dans la base de données source (dans mon cas dev db)> Cliquez sur le menu "Comparaison de données ...".
  2. Ensuite, l'assistant de comparaison de données est apparu, sélectionnez la base de données cible (dans mon cas, la base de données de production) et cliquez sur Suivant.
  3. Quelques secondes plus tard, il affichera certains enregistrements uniquement dans la base de données source. cliquez simplement sur le bouton «Mettre à jour la cible».
  4. Dans le navigateur, appuyez sur le bouton d'actualisation et voyez le message d'erreur disparu.

Notez que, encore une fois, il n'est pas recommandé dans les projets complexes et sérieux. Utilisez ceci uniquement si vous rencontrez des problèmes lors de l'apprentissage ASP.Net ou EntityFramework.

Youngjae
la source
1
Cela a fonctionné pour moi. C'était l'inverse, cependant. Ma base de données de production avait tous les enregistrements dans __EFMigrationHistory, tandis que ceux de la base de données dev manquaient d'une manière ou d'une autre (à l'exception de l'initial).
Jens Mander
1

Supprimer des lignes de la table dbo_MigrationHistory ou supprimer la table et exécuter

update-database -verbose

Il exécutera toutes les migrations de votre projet une par une

Ali Adravi
la source
1

Dans mon cas, le problème était dans Seeder. J'appelais _ctx.Database.EnsureCreated () à l'intérieur de celui-ci et pour autant que je sache, la commande de mise à jour de la base de données s'est exécutée avec succès, mais le semeur a ensuite essayé de créer la base de données "deuxième" fois.

Comment adresser:

  1. Exécutez la mise à jour, lancez simplement l'application et appelez EnsureCreated (). La base de données sera créée / mise à jour
  2. Commentez ou supprimez le semoir.
Chekusty
la source
1

Un autre scénario EF Core Edge-case.

Vérifiez que vous disposez d'un fichier Migrations / YOURNAMEContextModelSnapshot.cs .

comme détaillé dans - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

Si vous avez essayé de recréer manuellement votre base de données en supprimant les fichiers migration.cs, veillez à ce que votre fichier Migrations / * ContextModelSnapshot.cs existe toujours.

Sans cela, vos migrations ultérieures n'ont pas d'instantané sur lequel créer les différences requises et vos nouveaux fichiers de migrations auront l'air de tout recréer à partir de zéro, vous obtiendrez alors l'erreur de table existante comme ci-dessus.

WickedW
la source
1

la même chose s'est produite avec moi .. Le problème était qu'en fait j'ai supprimé ma table de base de données MoviesCastet créé une nouvelle table et le problème était que ma dernière migration essayait d'induire la table supprimée MoviesCastdans la base de données. Je l'ai résolu en supprimant simplement tout le contenu de la dernière migration et en exécutant simplement la méthode Up () & down ()

public override void Up()
{
}

public override void Down()
{
}

puis mis à jour la base de données et ajouter simplement une nouvelle migration

Caméléon
la source
1

J'ai eu le même problème décrit dans la réponse d'Elnaz. J'avais besoin de changer l'espace de noms du datalayer lors d'un refactoring de notre projet. Cela empêchait les migrations de voir les migrations existantes dans la base de données. J'ai trouvé une excellente réponse à ce problème sur le blog de James Chambers.

http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

J'ai simplement changé ce qui suit dans le fichier de configuration de la migration.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    this.ContextKey = Old_Namespace.Migrations.Configuration”;
}

J'espère que cela aide quelqu'un d'autre dans une impasse.

Nathan
la source
J'ai eu une situation similaire après des changements d'espace de noms. J'ai essayé ce correctif, mais cela n'a toujours pas fonctionné. J'ai donc modifié manuellement les espaces de noms dans la table de base de données, puis cela a commencé à fonctionner.
kosist
0

Exécutez simplement la commande update-migration -Script. Cela génère un nouveau script * .sql qui inclut toutes les modifications de base de données incluses dans la migration. À la fin du code se trouvent des commandes d'insertion quelque chose comme ceci: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) vous pouvez simplement exécuter tout cela INSERT et DB sera synchronisé

Rasto
la source
0

Après plus d'une heure sans résultat, j'ai essayé une autre approche, n'utilisant pas de migrations, mais j'ai fait une comparaison de schémas.

Dans Visual Studio -> Outils -> SQL Server -> Nouvelle comparaison de schéma

J'ai d'abord créé une nouvelle base de données complètement nouvelle avec les migrations EF. Ensuite, j'ai fait une comparaison, en comparant la nouvelle base de données avec celle que je voulais mettre à jour. J'ai finalement généré un script de migration et j'ai pu effectuer une mise à jour du schéma.

FrankyHollywood
la source
0

Dans mon cas (je veux réinitialiser et obtenir une nouvelle base de données),

J'ai d'abord reçu le message d'erreur: There is already an object named 'TABLENAME' in the database.

et j'ai vu, un peu avant:

"Applying migration '20111111111111_InitialCreate'.
Failed executing DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE MYFIRSTTABLENAME"

Ma base de données a été créée, mais aucun enregistrement dans l'historique des migrations.

Je supprime toutes les tables sauf dbo .__ MigrationsHistory

MigrationsHistory était vide.

Courir dotnet ef database update -c StudyContext --verbose

(--verbose juste pour le plaisir)

et obtenu Done.

JohnFI
la source
0

J'ai fait face au même bug que ci-dessous. Ensuite, je l'ai réparé comme ci-dessous:

  1. Vérifiez les bases de données actuelles de votre projet:
    • dotnet ef migrations list
  2. Si le plus récent est ce que vous avez ajouté, supprimez-le:
    • dotnet ef migrations remove
  3. Les sorties de garantie de cette base de données doivent être détaillées dans le code source: fichiers .cs / .Designer.cs

4.Maintenant, tout va bien. Essayez de rajouter: dotnet ef migrations add [new_dbo_name]

5.Enfin, essayez de mettre à jour à nouveau, en fonction de la liste de migration:

  • dotnet ef database update [First]
  • dotnet ef database update [Second]
  • ...
  • dotnet ef database update [new_dbo_name]

J'espère que cela vous sera utile. ^^

Mai Nguyen
la source
0

Vous avez supprimé le dossier de migration que vous essayez d'exécuter la commande "update-database" sur la console du gestionnaire de packages? si c'est le cas

Supprimez simplement manuellement toutes vos tables puis exécutez si update-databse (les données de départ seront supprimées)

Alok Singh
la source
0

Une autre façon de faire est de tout commenter dans la classe initiale, entre les méthodes Up et Down.Ensuite, exécutez update-database, après l'exécution de la méthode seed a réussi, alors exécutez à nouveau update-database.Cela peut être utile à certains amis.

Iman Mohadesi
la source
0

J'étais confronté au même problème. J'ai essayé la solution ci-dessous: 1. suppression du code de création de table de Up () et du code associé de la méthode Down () 2. Exécutez la commande update-database dans Package Manager Consol

cela a résolu mon problème

Ashu_90
la source
0

Remarque: je l'ai fait parce que je n'ai rien dans ma base de données. Dans mon cas: 1. J'ai supprimé une migration par commande remove-migration dans la console du gestionnaire de package 2. Base de données supprimée par le panneau 'Explorateur d'objets SQL Server'> sur la base de données actuelle> clic droit> Supprimer 3. Migré dans la console du gestionnaire de package écrire Ajouter -Migration et cliquez sur Entrée 4. La dernière mise à jour par la commande update-database

Erasyl Abenov
la source
0

Même cas (pas de table DB et MigrationHistory sur le serveur). Mes pas:

  1. J'ai supprimé les données de migration de la section Haut et Bas de ma première migration.
  2. Mettre à jour la base de données avec une migration vide (la table MigrationHistory a été créée)
  3. Ajoutez votre VRAIE migration et mettez à jour votre base de données avec elle.
Vasiliy Terkin
la source
0

Dans la base de données, interrogez la table __MigrationHistory et copiez [ContextKey].

Collez-le dans le DbMigrationsConfiguration ConextKey comme ci-dessous

internal sealed class DbConfiguration: DbMigrationsConfiguration<DbContext>
    {
        public DbConfiguration()
        {
            AutomaticMigrationsEnabled = true;
            ContextKey = "<contextKey from above>";
        }
LastTribunal
la source
0

Les étapes ci-dessous ont fonctionné pour moi pour le même problème:

Scénario:

J'essayais d'ajouter 2 nouveaux champs à mon modèle existant pour la fonctionnalité de messagerie. Les nouveaux champs sont "IsEmailVerified" et "ActivationCode"

Les étapes que j'ai suivies:

1. Suppression des anciens fichiers de migration dans le dossier "Migrations" qui m'ont empêché de faire Update-Database 2.Reverted toutes mes modifications récentes que j'ai faites sur le modèle

3. exécutez la commande ci-dessous:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = **** "

4. Suppression du contenu des méthodes Up () et Down () du fichier de migration et laissé les méthodes vides

5. exécutez la commande ci-dessous:

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. Après avoir exécuté l'étape ci-dessus, le modèle et la base de données semblent synchronisés.

  2. Maintenant, j'ai ajouté les nouvelles propriétés dans le modèle

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Exécutez la commande ci-dessous:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. Maintenant, le fichier de migration ne contient que mes modifications récentes comme ci-dessous:

       public override void Up()
         {
             AddColumn("dbo.UserAccounts", "IsEmailVerified", c => c.Boolean(nullable: false));
             AddColumn("dbo.UserAccounts", "ActivationCode", c => c.Guid(nullable: false));
         }        
         public override void Down()
         {
             DropColumn("dbo.UserAccounts", "ActivationCode");
             DropColumn("dbo.UserAccounts", "IsEmailVerified");
         }
  2. Exécutez la commande ci-dessous: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

11.Maintenant, j'ai mis à jour avec succès la base de données avec des colonnes supplémentaires.

Le tableau ci-dessous est mis à jour après les modifications récentes:

Tableau après la migration de mise à jour

Thamizh
la source
ne le recommande vraiment pas, la suppression des migrations de produits détruira simplement vos environnements. pourquoi devriez-vous supprimer vos migrations si elles fonctionnaient jusqu'à présent? et vos chaînes de connexion ne fonctionneront pas pour tous les utilisateurs ici, ne
devraient
-5

Dans le fichier de migration, vérifiez la méthode publique void Up () . Peut-être que vous essayez de créer un nouvel objet db qui est déjà dans la base de données. Vous devez donc supprimer cet objet / table avant la création de l'objet db. Fais juste comme ci-dessous

DropTable("dbo.ABC"); 
CreateTable(
            "dbo.ABC",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ..
                 }

Et maintenant, lancez votre migration Update-Database -TargetMigration: "2016_YourMigration"

Mohammad Al-Hasan
la source
6
Si vous faites cela, vous perdrez toutes vos données
Mehdiway