2015-04-23 18 views
5

sto usando Entity Framework 6 con questo DbMigrationsConfiguration:Entity Framework: Solo Seed per la costruzione di database iniziale

public sealed class Configuration : DbMigrationsConfiguration<DataContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 

    protected override void Seed(Danfoss.EnergyEfficiency.Data.DataContext context) 
    { 
     //Adding initial data to context 

     context.SaveChanges(); 
    } 

} 

lo sto usando in WebAPI in questo modo:

public static void Register(HttpConfiguration config) 
{ 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>()); 
} 

Ho notato che la funzione Seed è in esecuzione ogni volta che si avvia l'applicazione. Come posso evitare questo? Mi piace solo che venga eseguito la prima volta che viene eseguito, quando crea le tabelle iniziali.

+0

Nei miei progetti, invece, utilizzo ['AddOrUpdate'] (https://msdn.microsoft.com/en-us/library/hh846514%28v=vs.103%29.aspx). Qualcosa come 'context.Table.AddOrUpdate (entity => entity.Id, new Entity {Id = 1});'. Funzionerebbe? – Default

+0

Lo sto facendo anche io. Ma il mio metodo Seed ha un sacco di dati da gestire tra cui alcune importazione CSV. Non mi piace che ciò accada ogni volta che avvio la mia applicazione. – dhrm

+0

È possibile avere una tabella delle impostazioni con un valore di bit che indica se il database è stato seminato o meno e quindi agire in base a quel valore quando viene avviato il metodo seed, ad es. tornando subito quando hai scoperto che il seme è già stato usato. – Santhos

risposta

4

Il metodo DbMigrationsConfiguration.Seed viene chiamato ogni volta che si chiama Update-Database. Il ragionamento alla base di ciò è spiegato in questo blog da One Unicorn.

Ciò significa che è necessario scrivere il codice Seed per far fronte ai dati esistenti. Se non ti piace, puoi votare una modifica su CodePlex.

Nel frattempo, per citare il blog:

Il modo migliore per gestire questa situazione è di solito non utilizzare AddOrUpdate per ogni entità, ma per essere invece più intenzionale circa il controllo del database per i dati esistenti utilizzando qualsiasi meccanismo appropriato. Per esempio, Seme potrebbe verificare se un soggetto rappresentante esiste e poi ramo su quel risultato a uno aggiornare tutto o inserire tutto

Un'altra opzione, che ho usato in passato, è quello di aggiungere in piedi dati relativi a una migrazione nella migrazione stessa, utilizzando il comando Sql. In questo modo viene eseguito solo una volta. Ho teso ad allontanarmi da questo perché preferisco mantenere la semina in un posto.

Problemi correlati