2012-11-09 14 views
12

Moja metoda Seed() nigdy nie jest wywoływana. Jest wywoływana, gdy wykonuję Update-Database z konsoli menedżera pakietów, ale nigdy, gdy uruchamiam kod. Po usunięciu bazy danych tworzone są wszystkie tabele (w ten sposób wykonywane są moje klasy migracji), ale mój kod Seed() nigdy nie jest wywoływany. MVC 4, Frame Entity Frame 5 Code First.Moja metoda Seed() nigdy nie jest wywoływana w Code First EF 5

Global.asax:

protected void Application_Start() 
{ 
    Database.SetInitializer<MyContext>(new DbInitializer()); 
} 

DBInit:

internal class DbInitializer : MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration> 
{ 
} 

DBContext:

public partial class MyContext : DbContext 
{ 
    public MyContext() : base("DefaultConnection") 
    { 
    } 
    // public DBSets.... 
} 

Konfiguracja:

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
public Configuration() 
{ 
    // The constructor is actually called 
    AutomaticMigrationsEnabled = false; 
} 

protected override void Seed(MyContext context) 
{ 
    // My seed code, never called 
} 

Co może być nie tak?

+2

Czy jesteś pewien, że robisz coś w kontekście? DbContext jest leniwy; nie robi wiele z niczego, dopóki nie zaczniesz go używać, na przykład, uruchamiając zapytanie lub dodając obiekt. Twój inicjator uruchomi się tylko wtedy, gdy kontekst zostanie użyty po raz pierwszy. Możesz spowodować inicjalizację przez wywołanie context.Database.Initialize (false); –

+0

Mam ten sam problem, chociaż nie mam dość tej samej konfiguracji (polegam na doświadczeniu out of box) .Spróbowałem uruchomić context.database.Initialize (false) z wartością true i false, ale żadna z nich nie powodowała uruchomienia metody seed. – Noel

+0

@ArthurVickers Tak, jestem pewien. –

Odpowiedz

15

Więc powodem było to, że musiałem podać mój własny initializer w pliku konfiguracyjnym:

<entityFramework> 
     <contexts> 
     <context type="EFTest2.MyContext, EFTest2"> 
      <databaseInitializer type="EFTest2.Initializers.DbInitializer, EFTest2" /> 
     </context> 
     </contexts> 
     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 

Po tym, moja metoda Seed nazywa.

+0

dzięki człowiek pomógł –

+0

Database.SetInitializer (new MigrateDatabaseToLatestVersion ()); /* w konstruktorze kontekstu działa również */ –

5

Najpierw zapoznaj się z zaakceptowaną odpowiedzią.
Chcę tylko dodać bardzo ważną uwagę do tego problemu.

Miałem przed sobą DOKŁADNIE ten sam problem, który opisałem przez to pytanie (i to doprowadziło mnie do tutaj). ALE użyłem CreateDatabaseIfNotExists zamiast MigrateDatabaseToLatestVersion i moja metoda seed nie została wykonana nawet po zastosowaniu zaakceptowanej odpowiedzi.

Mój problem był następujący: Według documentation of the for the Seed method: sposób na DbMigrationsConfigurationSeed nie zostaną wykonane, jeśli baza danych Initializer jest jeden z następujących

Jeśli używasz jednego z tych typów, powinieneś utworzyć własną klasę, która dziedziczy z jednego z tych typów, a następnie zastąpić metodę seed w twojej własnej klasie.

W moim przypadku dodanie następującej klasy rozwiązało problem.

public class CreateNotifierDatabaseIfNotExists : CreateDatabaseIfNotExists<NotifierContext> 
{ 
    protected override void Seed(NotifierContext context) 
    { 
     // the code of the seeding is go here 
    } 
} 
+0

Oto czego nie rozumiem: Kiedy nie używałbyś jednej z tych klas? Podążyłem za przykładem w książce, w której podano "DropCreateDatabaseIfModelChanges", która stworzyła moją bazę danych, a następnie zmieniłem ją na 'NullDatabaseInitializer' i' DbMigrationsConfiguration' do zaszczepienia. Wszystko działa dobrze na moim końcu, ale teraz dowiaduję się, że baza danych nie jest tworzona dla innych programistów. Więc zmieniłem go na 'CreateDatabaseIfNotExists', a teraz tworzy, ale nie rozsiewa. Czy konfiguracja "DbMigrationsConfiguration" jest przeznaczona tylko dla bazy danych nie utworzonej przez EF? – xr280xr

Powiązane problemy