I am using Entity Framework in VS2012 with SQL Server 2008 R2. I have migration enabled, and I am adding a string field (ie. DropboxUrl) to one of my database classes (ie. Designs).
// 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);
In Package Manager Console, when I run PM> update-database, it complains that there is already an object named 'Companies' in the database. 'Companies' is a table that currently exists in the existing database that I am trying to update.
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.
Attempt 1: After searching for this error, I came across this workaround: http://christesene.com/entity-framework-4-3-code-first-with-automatic-migrations/
It recommended that I run first
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.
And removed the Up/Down method:
ie. I could see that DropboxUrl was a field in the Up method but I removed it as suggested.
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);
*/
}
Afterwards, I run update-database again, and it appears to be successful.
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
Issue 1: My table was not altered after the update (ie. the DropboxUrl column that is present in code wasn't added to the database).
Issue 2: And I also could not get the database back to its initial state:
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.
Attempt 2: I also tried using the -IgnoreChanges flag when I add-migration: Automatic Migrations for ASP.NET SimpleMembershipProvider
PM> Add-migration initial -IgnoreChanges
Re-scaffolding migration 'initial'.
PM> update-database -verbose
Again, I saw the same thing, where the update-database succeeds but the database column DropboxUrl was not added to the Designs table. However, if I create a new database, then the DropboxUrl column is present as expected.
Question: How could I get around the there is already an object named 'Companies' in the database error while doing update-database, and still successfully add my column? It seems like it should be a basic scenario that just works.
Thanks.