Aggiornamento-Database di aggiornamento della migrazione del framework dell'entità è riuscita ma la colonna del database non viene aggiunta

StackOverflow https://stackoverflow.com//questions/24007883

Domanda

Sto usando il framework di entità in VS2012 con SQL Server 2008 R2. Ho abilitato la migrazione e sto aggiungendo un campo di stringa (cioè DropBoxBorsl) a una delle mie classi di database (cioè disegni).

// Design.cs

public class Design
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        [StringLength(Constants.DESIGN_NAME_MAX_LENGTH)]
        public string Name { get; set; }

        [StringLength(Constants.DESIGN_DESC_MAX_LENGTH)]
        public string Description { get; set; }

        public ItemDate Dates { get; set; }

        public string DropboxUrl { get; set; } // Added this line
    }

// SedaContext.cs:

public class SedaContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }

        public DbSet<Design> Designs { get; set; }
…
}


// Global.aspx
protected void Application_Start()
        {

            // Application initialize
            // https://stackoverflow.com/questions/3600175/the-model-backing-the-database-context-has-changed-since-the-database-was-crea

            Database.SetInitializer<SedaContext>(null);
.

nella console del gestore dei pacchetti, quando corro PM> Aggiornamento-Database, si lamenta che esiste già un oggetto denominato "Aziende" nel database. 'Aziende' è una tabella che attualmente esiste nel database esistente che sto cercando di aggiornare.

IE.

PM> update-database -verbose
Using StartUp project 'UI'.
Using NuGet project 'UI'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'SedaDev' (DataSource: ., Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201405311730564_AutomaticMigration.
CREATE TABLE [dbo].[Companies] (
    [Id] [uniqueidentifier] NOT NULL DEFAULT newsequentialid(),
    [Name] [nvarchar](max),
    [Description] [nvarchar](max),
    [Owner_UserId] [int],
    CONSTRAINT [PK_dbo.Companies] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Companies' in the database.
...
   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:fa9e9e62-aba0-435f-9309-e9fc8fbe19d5

There is already an object named 'Companies' in the database.
.

Tentativo 1: Dopo aver cercato questo errore, ho trovato questa soluzione alternativa: http://christene.com/enty-framework -4-3-Codice-First-with-Automatico-Migrations /

Si consiglia di eseguire prima

PM> Add-migration initial

Scaffolding migration 'initial'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration initial' again.
.

e rimosso il metodo Su / Giù:

cioè. Potrei vedere che DropBoxurl era un campo nel metodo UP, ma l'ho rimosso come suggerito.

public override void Up()
        {
/*
    CreateTable(
                "dbo.Companies",
                c => new
                    {
                        Id = c.Guid(nullable: false, identity: true),
                        Name = c.String(),
                        Description = c.String(),
                        Owner_UserId = c.Int(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.UserProfiles", t => t.Owner_UserId)
                .Index(t => t.Owner_UserId);
...
  CreateTable(                "dbo.Designs",
                c => new
                    {
                        Id = c.Guid(nullable: false, identity: true),
                        Name = c.String(maxLength: 100),
                        Description = c.String(maxLength: 1000),
                        Dates_Create = c.DateTime(nullable: false),
                        Dates_LastUpdate = c.DateTime(nullable: false),
                        DropboxUrl = c.String(),
                        Project_Id = c.Guid(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Projects", t => t.Project_Id)
                .Index(t => t.Project_Id);
*/
        }
.

Successivamente, eseguo nuovamente l'aggiornamento-database e sembra che abbia successo.

PM> update-database -verbose
Using StartUp project 'UI'.
Using NuGet project 'UI'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'SedaDev' (DataSource: phobos.spxis.com, Provider: System.Data.SqlClient, Origin: Configuration).
Applying explicit migrations: [201406020449030_initial].
Applying explicit migration: 201406020449030_initial.
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])

VALUES (N'201406020449030_initial', N'Delecs.Seda.DataAccess.Migrations.Configuration',  0x1F8B0800000000000400ED1DCB72DCB8F19EAAFCC3D49C92544523D9F166
...
7B7C117028FAD9D8632C54E5F87C13A0D36590D83B7A73FA9F8AD368F7FFE3F0347EA807B340100 , N'6.0.2-21211')
Running Seed method
.

Problema 1: La mia tabella non è stata modificata dopo l'aggiornamento (es. La colonna DropBoxUnil presente che è presente nel codice non è stata aggiunta al database).

Edizione 2: e non riuscivo anche a recuperare il database al suo stato iniziale:

IE.

PM> update-database -TargetMigration $InitialDatabase
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Reverting migrations: [201406020449030_initial].
Reverting automatic migration: 201406020449030_initial.
Automatic migration was not applied because it would result in data loss.
PM> update-database -TargetMigration $InitialDatabase -force
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Reverting migrations: [201406020449030_initial].
Reverting automatic migration: 201406020449030_initial.
System.Data.SqlClient.SqlException (0x80131904): Could not drop object 'dbo.UserProfiles' because it is referenced by a FOREIGN KEY constraint.
.

Tentativo 2: Ho anche provato a utilizzare il flag di -ignoreChanges quando aggiungo-migrazione: migrazioni automatiche per ASP.NET SimplemembershipProvider

PM> Add-migration initial -IgnoreChanges
Re-scaffolding migration 'initial'.

PM> update-database -verbose
.

Ancora una volta, ho visto la stessa cosa, in cui il database di aggiornamento ha esito positivo, ma la colonna del database DropBoxUlll non è stata aggiunta alla tabella Designs. Tuttavia, se creo un nuovo database, la colonna DropBoxUll è presente come previsto.

Domanda: Come potrei girare in giro, c'è già un oggetto denominato "Aziende" nell'errore del database mentre si esegue l'aggiornamento-database e continua a aggiungere con successo la mia colonna? Sembra che dovrebbe essere uno scenario di base che funziona solo.

Grazie.

È stato utile?

Soluzione

Quando hai commentato i metodi UP () e Down () sulla migrazione che hai rimosso il codice per aggiungere la colonna del database.

Dovresti cambiare () () () come segue per la tua iniziale:

public override void Up() {
   AddColumn("Companies", "DropboxUrl", x => x.String());
}

public override void Down() {
    DropColumn("Companies", "DropboxUrl");
}
.

Per il framework di entità per capirlo per te in futuro, è necessario eseguire una migrazione iniziale per far capire, c'è una tabella esistente prima di aggiungere la proprietà al codice .per esempio.Add-Migration -force -ignore.

Quindi aggiungi la colonna e vai Add-Migration AddedDropboxUrlColumn e genererà i metodi su () e down () come ho descritto in una nuova migrazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top