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>
database
entity-framework
ef-code-first
entity-framework-6
ef-migrations
Dit Roohullah Allem
la source
la source
Réponses:
il semble qu'il y ait un problème dans le processus de migration, exécutez la commande add-migration dans "Package Manager Console":
effectuez quelques modifications, puis mettez à jour la base de données à partir du fichier "Initial":
Edit: -IgnoreChanges est dans EF6 mais pas dans EF Core, voici une solution de contournement: https://stackoverflow.com/a/43687656/495455
la source
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éeContextKey
.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 laContextKey
colonne endbo.__MigrationHistory
"EFDataAccess.Migrations.Configuration
".Puis côté code, dans Tools => Package Manager Console, utilisez la
update-database
commande.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éritezMigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>
et laissez cette classe vide. La dernière chose à faire est d'appelerDatabase.SetInitializer(new YourDbInitializer());
votre DbContext dans un constructeur statique.J'espère que votre problème sera résolu.
la source
MigrationHistory
table 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.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 :
la source
Dans mon cas, ma
EFMigrationsHistory
table était vidée (d'une manière ou d'une autre) et en essayant de courirupdate-database
, j'obtenais: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
EFMigrationsHistory
table. 1 ligne pour chaque migration dont je savais que la base de données était à jour.Une ligne aura 2 colonnes:
MigrationId
etProductVersion
MigrationId
est le nom de votre fichier de migration. Exemple:20170628112345_Initial
ProductVersion
est la version ef que vous utilisez. Vous pouvez le trouver en tapantGet-Package
dans la console du gestionnaire de packages et en recherchant votre package ef.J'espère que cela est utile pour quelqu'un.
la source
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
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.
la source
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/
la source
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 vousPour le résoudre, supprimez simplement ce code et écrivez ce que vous voulez. Par exemple, je voulais ajouter une colonne donc j'écris juste
la source
@
suivi de mon nom d'utilisateur dans la section commentaires.Remarque: solution non recommandée. mais solution rapide dans certains cas.
Pour moi,
dbo._MigrationHistory
dans 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.
dbo._MigrationHistory
le 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 ...".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.
la source
Supprimer des lignes de la table dbo_MigrationHistory ou supprimer la table et exécuter
Il exécutera toutes les migrations de votre projet une par une
la source
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:
la source
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.
la source
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
MoviesCast
et créé une nouvelle table et le problème était que ma dernière migration essayait d'induire la table suppriméeMoviesCast
dans 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 ()puis mis à jour la base de données et ajouter simplement une nouvelle migration
la source
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.
J'espère que cela aide quelqu'un d'autre dans une impasse.
la source
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é
la source
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.
la source
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:
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.
la source
J'ai fait face au même bug que ci-dessous. Ensuite, je l'ai réparé comme ci-dessous:
dotnet ef migrations list
dotnet ef migrations remove
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. ^^
la source
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)
la source
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.
la source
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
la source
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
la source
Même cas (pas de table DB et MigrationHistory sur le serveur). Mes pas:
la source
Dans la base de données, interrogez la table __MigrationHistory et copiez [ContextKey].
Collez-le dans le DbMigrationsConfiguration ConextKey comme ci-dessous
la source
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 = " ***
Après avoir exécuté l'étape ci-dessus, le modèle et la base de données semblent synchronisés.
Maintenant, j'ai ajouté les nouvelles propriétés dans le modèle
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 = " ***
Maintenant, le fichier de migration ne contient que mes modifications récentes comme ci-dessous:
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
la source
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
Et maintenant, lancez votre migration
Update-Database -TargetMigration: "2016_YourMigration"
la source