15

Ho avuto problemi con questo problema da 4.1 (ora sono su 4.3). Mi sembra che per ottenere il metodo di seme chiamato, tutto quello che ho dovuto fare è la seguente:metodo seed non chiamato con EntityFramework CodeFirst

1) Creare un catalogo di dati vuota su SQLServer 2) Eseguire il codice qui sotto:

Database.SetInitializer(new DropCreateDatabaseAlways<SiteDB>()); 

ho il mio SiteDB definito come segue:

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
      ... (break point set here that never gets hit) 

mi sento come devo mancare qualcosa di molto semplice, perché questo crea le mie tabelle, ma non mai chiama il metodo seme.

Per rendere questo più chiaro, ecco un esempio completo che include tutto il codice. Quando l'eseguo, seme non viene mai chiamato:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Text; 
using System.Data.Entity; 

namespace ConApp 
{ 
internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Database.SetInitializer(new SiteDBInitializer()); 
     using (var db = new SiteDB()) 
     { 
      var x = db.Customers; 
     } 
    } 
} 

public class SiteDB : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    public string LastName { get; set; } 
} 

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
     db.Customers.Add(new Customer() {LastName = "Kellner"}); 
     db.Customers.Add(new Customer() {LastName = "Jones"}); 
     db.Customers.Add(new Customer() {LastName = "Smith"}); 
     db.SaveChanges(); 
    } 
} 

} 

risposta

8

È necessario chiamare Database.SetInitializer(new SiteDBInitializer()); invece.

+1

Suppongo che vogliate: Database.SetInitializer (nuovo SiteDBInitializer()); L'ho provato e non ha funzionato neanche. –

+1

@PeterKellner Viene chiamato quando si fa qualcosa (es. Query) per la prima volta. Hai provato a eseguire una query? – Eranga

+0

Ciao Eranga e J.W. Ho aggiornato la mia domanda per includere un'app banale della console che ritengo debba essere chiamata seed e non lo è. Se tu potessi dare un'occhiata (e anche incollarlo ed eseguirlo), lo apprezzerei molto. Sono sicuro che ci sia qualcosa di semplice che mi sfugge ma che sta facendo impazzire da mesi. –

0

Ho guardato tutte le risposte per quello, niente funziona davvero, e mi chiedo se questo è un bug di Microsoft per non chiamare il metodo Seed quando DB non esiste. l'unico codice che ha funzionato, è stato quello di rendere effettivamente la classe chiamare il seme se DB non esiste: classe

Contesto:

class AlisDbContext : DbContext 
{ 
    public class MyContextFactory : IDbContextFactory<AlisDbContext> 
    { 
     public AlisDbContext Create() 
     { 
      return new AlisDbContext("CompactDBContext"); 
     } 
    } 

    public AlisDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
     Database.SetInitializer(new AlisDbInitializer(this)); 
     Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AlisDbContext>()); 
    } 

    public DbSet<SavedCredentials> SavedCredentialses { get; set; } 
} 

Poi AlisDbInitializer bisogno di controllare e chiamare il metodo seme come:

public AlisDbInitializer(AlisDbContext alisDbContext) 
    { 
     if (!alisDbContext.Database.Exists()) 
     { 
      Seed(alisDbContext); 
     }   
    } 
Problemi correlati