15

He estado luchando intermitentemente con este problema desde 4.1 (ahora estoy en 4.3). Me parece que para obtener el método semilla llamada, todo lo que tendría que hacer es lo siguiente:método de inicialización no llamado con EntityFramework CodeFirst

1) Crear un catálogo de datos vacía en sqlserver 2) Ejecutar el código de abajo:

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

tengo mi SiteDB define como sigue:

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

siento que debo estar perdiendo algo muy simple, porque esto crea mis cuadros, pero nunca se llama al método de siembra.

Para que esto sea más claro, aquí hay un ejemplo completo que incluye todo el código. Cuando lo ejecuto, la semilla nunca se llama:

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(); 
    } 
} 

} 

Respuesta

8

Es necesario llamar Database.SetInitializer(new SiteDBInitializer()); lugar.

+1

Supongo que quiere decir: Database.SetInitializer (new SiteDBInitializer()); Intenté eso y tampoco funcionó. –

+1

@PeterKellner Se llama cuando haces algo (por ejemplo, consultar) por primera vez. ¿Intentó ejecutar una consulta? – Eranga

+0

Hola Eranga y J.W. He actualizado mi pregunta para incluir una aplicación de consola trivial que creo que debería llamarse a seed y no es así. Si pudieras echar un vistazo (e incluso pegarlo y ejecutarlo), realmente lo agradecería. Estoy seguro de que hay algo simple que me falta, pero ha estado volviendo loco durante meses. –

0

Miré todas las respuestas para eso, nada funciona realmente, y me pregunto si eso es un error de Microsoft por no llamar al método Seed cuando DB no existe. El único código que funcionaba, era hacer realidad la clase de llamar la semilla si DB no existe: Clase

Contexto:

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; } 
} 

Entonces AlisDbInitializer necesario comprobar y llamar al método de semillas como:

public AlisDbInitializer(AlisDbContext alisDbContext) 
    { 
     if (!alisDbContext.Database.Exists()) 
     { 
      Seed(alisDbContext); 
     }   
    } 
Cuestiones relacionadas