43

Also habe ich versucht, automatische Migrationen mit meinem neuen MVC 4 Projekt zu verwenden, aber irgendwie funktioniert es nicht. I followed this blog post Schritt für Schritt.Automatische Migrationen für ASP.NET SimpleMembershipProvider

Ich habe die Änderungen an das UserProfile Kontenmodell (das NotaryCode Feld) hinzugefügt:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public int NotaryCode { get; set; } 
} 

Dann habe ich auf der Paket-Manager-Konsole schrieb enable-migrations und eine Klasse-Konfiguration erschienen (erbt von DbMigrationsConfiguration<Web.Models.UsersContext>), dann fülle ich die Klasse wie:

public Configuration() 
{ 
    AutomaticMigrationsEnabled = true; 
} 

protected override void Seed(Atomic.Vesper.Cloud.Web.Models.UsersContext context) 
{ 
    WebSecurity.InitializeDatabaseConnection(
      "DefaultConnection", 
      "UserProfile", 
      "UserId", 
      "UserName", autoCreateTables: true); 

    if (!Roles.RoleExists("Atomic")) 
     Roles.CreateRole("Atomic"); 

    if (!Roles.RoleExists("Protocolista")) 
     Roles.CreateRole("Protocolista"); 

    if (!Roles.RoleExists("Cliente")) 
     Roles.CreateRole("Cliente"); 

    string adminUser = "randolf"; 

    if (!WebSecurity.UserExists(adminUser)) 
     WebSecurity.CreateUserAndAccount(
      adminUser, 
      "12345", 
      new { NotaryCode = -1 }); 

    if (!Roles.GetRolesForUser(adminUser).Contains("Atomic")) 
     Roles.AddUsersToRoles(new[] { adminUser }, new[] { "Atomic" }); 
} 

Und dann habe ich versucht, update-database -verbose aber das funktioniert nicht zu laufen. Ich meine, das ist die Ausgabe:

Es gibt bereits ein Objekt namens "UserProfile" in der Datenbank.

PM> update-database -verbose 
Using StartUp project 'Web'. 
Using NuGet project 'Web'. 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Target database is: 'VesperCloud' (DataSource: .\SQLSERVER, Provider: System.Data.SqlClient, Origin: Configuration). 
No pending code-based migrations. 
Applying automatic migration: 201211051825098_AutomaticMigration. 
CREATE TABLE [dbo].[UserProfile] (
    [UserId] [int] NOT NULL IDENTITY, 
    [UserName] [nvarchar](max), 
    [NotaryCode] [int] NOT NULL, 
    CONSTRAINT [PK_dbo.UserProfile] PRIMARY KEY ([UserId]) 
) 
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'UserProfile' 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) 
    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.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) 
    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, Boolean downgrading, Boolean auto) 
    at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument 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.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() 
ClientConnectionId:a7da0ddb-bccf-490f-bc1e-ecd2eb4eab04 
**There is already an object named 'UserProfile' in the database.** 

Ich weiß, dass das Objekt existiert. Ich meine, ich versuche automatische Migrationen zu verwenden, um sie genau zu modifizieren und auszuführen, ohne die DB manuell neu erstellen zu müssen. Aber irgendwie funktioniert das nicht.

Ich sehe in der Dokumentation MSDN und fand die Eigenschaft:

AutomaticMigrationDataLossAllowed = true; 

Aber es auf true setzen nicht alles ändern. Ich denke, ich vermisse etwas, aber irgendwie finde ich nicht was. Irgendeine Idee?

+0

Bitte schauen Sie auf meine Antwort auf http://stackoverflow.com/questions/26305273/there-is-already-an-object-named-in-the-database/28316226#28316226 hoffe, das hilft ... –

Antwort

127

update-database -verbose funktioniert nicht, da Ihr Modell geändert wurde, nachdem Ihre Datentabelle bereits vorhanden war.

Stellen Sie zunächst sicher, dass die UserProfile-Klasse nicht geändert wurde. Dann laufen:

Add-Migration InitialMigrations -IgnoreChanges

Dies sollte eine leere "InitialMigration" Datei erzeugen. Fügen Sie nun der UserProfile-Klasse die gewünschten Änderungen hinzu. Sobald Änderungen hinzugefügt werden, das Update erneut Befehl ausführen:

update-database -verbose

Nun ist die automatische Migration angewandt wird und die Tabelle wird mit Änderungen geändert werden.

+5

Eigentlich hat das perfekt funktioniert. Leider kann ich Ihnen nicht mehr als ein +1 und die angenommene Antwort geben. Sie sparen mir Tonnen von Kopfschmerzen. Danke noch einmal. Das nächste ist, sollte ich immer die Add-Migration InitialMigrations verwenden? Oder das ist erst das erste Mal. Ich finde keinen Online-Dokument darüber. –

+1

Gern geschehen. Sie müssen es nur einmal ausführen, um eine InitialMigrations-Klasse zu erstellen. –

+3

Gleiches Problem. Diese Lösung hat auch für mich funktioniert. Vielen Dank! +1 – kmehta

6

Wie sieht es hier aus, dass Sie Migrationen aktiviert haben und dann die Anwendung ausgeführt haben. Wenn Sie die Anwendung ausführen, bevor Sie den UpdateDatabase-Befehl verwenden, erstellt EntityFramework die Datenbank und füllt sie. Da die Datenbank jedoch bei der Aktivierung von Migrationen nicht vorhanden war, wurde die InitialCreate-Migration nicht erstellt. Migrations denkt immer noch, dass Sie eine leere Datenbank haben und alle Objekte in Ihrem Modell erstellen möchten

Sie können versuchen, entweder Migrationen erneut zu aktivieren, die eine InitialCreate-Migration generieren, die den aktuellen Status der Datenbank widerspiegelt. In diesem Fall würde ich die Änderungen speichern, die Sie an der Seed-Methode vorgenommen haben, anstatt "Enable-Migrations -Force" auszuführen. Dies sollte die Migration neu erstellen und eine IntialCreate-Migration generieren. Sie können dann die Startmethode erneut auffüllen und den UpdateDatabase-Befehl ausführen.

+0

Ich probiere das schon (vor 2 Tagen) und nop. Es funktioniert nicht. –

0

Ich hatte gleich und auf andere Weise sortiert.Ging zu meiner lokalen DB gelöscht die UserProfile und andere Tabellen mit Fremdschlüssel Einschränkungen webpages_Membership, webpages_OAuthMembership, webpages_Roles, webpages_UsersInRoles Tabellen. All diese werden neu erstellt, wenn Sie update-database -verbose ausführen.