Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Code First Migration with Connection Strings

So I've managed to get Code First running and it works great.

Since I am still developing the application the structure of the Database isn't finalize and so I need to implement migrations.

I followed the Official Blog Post and got that Update-Database command working.

However, this only updates the SQLExpress version of the database. The production version of the database is on Azure and I specify the connection string at run time so the Update-Database command doesn't work on that.

So my final question is: how do I apply automatic migrations to the production database whose connection string is specified at runtime?

like image 489
Dragonseer Avatar asked Feb 25 '12 05:02

Dragonseer


People also ask

How do I code my first migration to an existing database?

Run the Add-Migration InitialCreate command in Package Manager Console. This creates a migration to create the existing schema. Comment out all code in the Up method of the newly created migration. This will allow us to 'apply' the migration to the local database without trying to recreate all the tables etc.

What are the migration commands we use with Code First approach in Entity Framework?

Run Enable-Migrations command in a Package Manager console. This command added two more classes to your project in the Migrations folder. This migration was generated because Code First already created a database for us before we enabled migrations. It allows you to configure how Migrations behave for your context.

How do I get connection string from EDMX?

You can use DbContext with an edmx file, and you will still have an EntityConnection string rather than a Database ConnectionString when using this method.


2 Answers

On the package manager console type:

Get-Help Update-Database

Relevant part:

    Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [<Com monParameters>] 

So you can do a Update-Database -ConnectionStringName "MyConnectionString" and it should work like a charm.

You also have a MigrateDatabaseToLatestVersion database initializer, if you set it (via Database.SetInitializer()), when you deploy your app on production with proper connection string, on first db access it should automagically migrate your db to the latest version.

I suggest caution though, always backup things.

Update

@Alexy Strakh recent comments spawned another argument worth putting in the answer.

Properly configuring a deployment system using Code First Migrations, given 2 ConnectionStrings.

  1. Define your connection strings in web.config (prod and dev), with default passwords
  2. Have the configuration system of your application know about the prod and dev connection configurations, optionally build unit tests to ensure the right one is picked*
  3. Employ config file transformation and have it transform your web.config into the one with production values
  4. Deploy your package to production (this should be the most cutting edge way)

You are not supposed to interact with the production environment from your development box, but if you really need to do that, then make it a temporary solution that needs to be reverted as soon as you're done.

Another option is to simply use the Web.Debug.config and Web.Release.config and have a central template for the main web.config (which would be the only one you check in in your source control).

Just make sure never to check in production or personal-development passwords (if any).

*You can use the DEBUG symbol to check how the application is running.

like image 143
WDRust Avatar answered Sep 19 '22 13:09

WDRust


Why does Entity Framework's EF Migrations Add-Migration step require a database connection string?

Has a solution which i consider less labor intensive in the long run. As if you create a connection string with the same name

On your context :base("DBName")

Connection string name and initial catalog match the DBName you specified and you don't need to enter the connection string name every time.

like image 36
P6345uk Avatar answered Sep 18 '22 13:09

P6345uk