Op dit moment wordt er les gegeven in MVC 4 voor de derdejaars. Dit doen we samen met Centric die ook deels de lessen verzorgen. Een van de benaderingen binnen MVC 4 en het Entity Framework is Code First, waarbij de programmeur de classes OO maakt en daaruit het datamodel genereerd. Echter als je dit op AppHarbor wilt deployen, loop je tegen een foutmelding aan. Dit komt, omdat je de database moet laten genereren.
CreateDatabaseIfNotExists
Binnen je solution is het belangrijk dat je instelt dat de database wordt aangemaakt op het moment dat deze niet bestaat. Dat kan je doen in je Global.asax.cs. In de InitializeDb methode zet je de volgende code:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { InitializeDb(); AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); } private static void InitializeDb() { // Initializer code here Database.SetInitializer(new CreateDatabaseIfNotExists<MassEmailerContext>()); } }
De Database.SetInitializer zorgt er hier voor dat de database wordt aangemaakt op het moment dat deze nog niet bestaat. Je hebt niet de rechten om de database de droppen, dus DropCreateDatabaseIfModelChanges werkt niet. MassEmailerContext is mijn custom context voor het Entity Framework. Dit kan je gewoon vervangen door je eigen context.
Cloud Database
De volgende stap is het opnieuw toevoegen van de SQL server op AppHarbor. Als je nog niets in je database hebt staan, dan zit je goed. Anders is het belangrijk dat je een lege toevoegt. Nadat je dit hebt gedaan is het belangrijk dat je de Alias van de SQL server zet naar de naam van je Entity Framework connectie. Dit zorgt ervoor dat, tijdens het deployen, de SQL connectie string wordt vervangen door die van AppHarbor. Dan hoef je deze niet zelf aan te passen in je web.config.
<connectionStrings> <add name="MassEmailerContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=MassEmailerContext-20130313212705; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|MassEmailerContext-20130313212705.mdf" providerName="System.Data.SqlClient" /> </connectionStrings>
Hier gaat het dus om de naam MassEmailerContext uit het ‘name’ attribuut. Deze zet je in je Alias van de SQL server. Ga daarvoor naar je Applicatie binnen AppHarbor, dan bij Add ons SQL Server, dan Go To SQL Server en Edit Alias bij Connectionstring Alias. Zet deze naar de naam uit de ‘name’ attribuut.
Pas nu de solution pushen. AppHarbor zal de connectionstring vervangen en de MVC 4 applicatie zal de benodigde tabellen automatisch aanmaken wanneer deze nodig zijn.
Succes!