2012-03-12 15 views
15

In questo momento, in fase di sviluppo Ho il seguente codice nel file Global.asax.cs che chiama l'Entity Framework (v4.1) SetInitializer con la mia SeedSampleData metodo . Tutto funziona perfettamente.Definire Entity Framework SetInitializer in web.config

Tuttavia, vorrei memorizzare il parametro "strategia" SetInitializer tramite un'impostazione web.config in modo che sia possibile creare uno script di distribuzione che lo imposterà automaticamente su new System.Data.Entity.CreateDatabaseIfNotExists<EfDbContext>() anziché sul metodo seed durante la distribuzione della produzione.

Il motivo per cui si desidera spostare questo in web.config è che quando lancio una nuova distribuzione sul server di produzione, voglio essere sicuro di non lasciare accidentalmente il mio inizializzatore di semi nel codice.

protected void Application_Start() 
{ 
    //TODO: Figure out how to move the following lines to web.config and have a deployment script modify it when going to production. 

    //This line is for production 
    //System.Data.Entity.Database.SetInitializer(new System.Data.Entity.CreateDatabaseIfNotExists<EfDbContext>()); 

    //This line is for development 
    System.Data.Entity.Database.SetInitializer(new Domain.Concrete.SeedSampleData()); 

    //... Remainder of Application_Start calls here... 
} 

risposta

18

Se si aggiorna a EF 4.3 (che è una buona idea in ogni caso), allora si può usare qualcosa di simile nel vostro web di configurazione:

<configuration> 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections> 

    <entityFramework> 
    <contexts> 
     <context type=" Blogging.BlogContext, MyAssembly"> 
     <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" /> 
     </context> 
    </contexts> 
    </entityFramework> 
</configuration> 

Rowan ha scritto su di esso in dettaglio: http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-configuration-file-settings.aspx

Se si desidera continuare a utilizzare 4.1, è possibile utilizzare una sintassi più vecchia. Ne ho scritto qui: http://blog.oneunicorn.com/2011/03/31/configuring-database-initializers-in-a-config-file/

+0

Questo è quello che volevo scoprire. Grazie per l'informazione! – bigmac

4

Se ho capito bene, il vostro SeedSampleData inizializzazione viene utilizzato solo per scopi di debug?

Non so se c'è un parametro di configurazione per controllare questo, ma è possibile utilizzare direttive del preprocessore:

#if DEBUG 
System.Data.Entity.Database.SetInitializer(new Domain.Concrete.SeedSampleData()); 
#else 
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.CreateDatabaseIfNotExists<EfDbContext>(); 
#endif 

(assumendo, naturalmente, che non si distribuisce assemblee di debug in produzione. ..)

+0

Thomas, grazie per l'informazione. Vado con la soluzione di AjcVicker, ma probabilmente la tua opzione funzionerà perfettamente. Lo apprezzo! – bigmac