2011-05-15 4 views
20

Así que estoy aprendiendo MVC3 y EF4. Probé el primer método de código, pero fue demasiado confuso para mí ... No puedo crear clases, pero la parte más difícil se presenta cuando se trata de claves externas y las relaciones entre ellas.¿Cómo sembrar datos cuando se usa el enfoque de Model First?

Pero primero me he ido con el modelo. De esta manera, puedo diseñarlo visualmente y ver dónde están las relaciones.

Después de crear mi modelo, crea un SQL que ejecuto contra mi base de datos SQL Express. Hecho y hecho.

Ahora quiero datos en mis tablas. Por supuesto, puedo agregarlos usando el explorador de servidor, pero lo más probable es que haga cambios en mi modelo a medida que avanzo. Y sigue actualizando la base de datos. Entonces no puedo seguir ingresando datos manualmente. Sé que si usa el código primero puede derivar el DropCreateDatabaseIfModelChanges y anular el método seed.

Sin embargo, ¿cómo hago esto con el primer modelo de enfoque? Tengo el siguiente código:

public class DatabaseInitializer : IDatabaseInitializer<BettingContext> { 
    public void InitializeDatabase(BettingContext context) { 
     var teams = new List<Team> { 
      new Team { Name="Toronto Maple Leafs", League="NHL"}, 
      new Team { Name="Boston Bruins", League="NHL"}, 
      new Team { Name="Vancouver Canucks", League="NHL"}, 
      new Team { Name="Nashville Predators", League="NHL"}, 
      new Team { Name="Montreal Canadiens", League="NHL"}, 
     }; 
    } 
} 

Por supuesto y en mi archivo global:

protected void Application_Start() 
{ 
    Database.SetInitializer<BettingContext>(new DatabaseInitializer()); 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
} 

y ahora qué? ¿Cómo le digo que ejecute el método? ¿Qué estoy haciendo mal?

Respuesta

6

Puede tener algo como esto:

public class MySeedData : DropCreateDatabaseIfModelChanges<YourDataBaseContextClass> 
{ 
    protected override void Seed(YourDataBaseContextClass context) 
    { 
     // Create objects here and add them to your context DBSets... 

    } 
} 

public class YourDataBaseContextClass : DbContext 
{ 


} 

Entonces, dentro de Application_Start() se llama:

Database.SetInitializer(new MySeedData()); 

En su caso, usted podría intentar crear DbSets (utilizando el modelo primeras clases) de forma manual y intente enchufarlo usando el código de arriba. Es una especie de mezcla de Model First + Code First.

public class FourthCoffeeWebContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Product> Products { get; set; } 
} 

Agregando a esto: CreateDatabaseIfNotExists<(Of <(<'TContext>)>)>

+1

¿Funcionaría esto incluso si estoy utilizando el enfoque Model First en lugar de Code First? – masfenix

+0

@masfenix: probablemente ... –

+2

Esto no funciona en absoluto :( – masfenix

13

Modelo primera es significativamente diferente del Código En primer lugar ya que en realidad genera la base de datos del modelo que se está trabajando en él. Usted obtiene el SQL para crear la base de datos y ejecutarla manualmente, por lo tanto, me pareció lógico mantener junto a esta una segunda secuencia de comandos SQL con mis datos de inicialización.

Si realizo cambios en el modelo, el script SQL se actualiza y, por supuesto, necesito revisar mi script SQL inicial (que está convenientemente ubicado justo al lado del script de creación de la base de datos). Simplemente ejecuto 1 después del otro.

Este enfoque ha estado funcionando bien hasta el momento y no crea la confusión de 'dónde está este cargador de datos y cómo identifica una base de datos vacía'. (También puedo incluir estos dos scripts SQL en mi proyecto de instalación para mi acción personalizada para crear la base de datos con los datos de semillas.)

0

utilizo un controlador de siembra similar al siguiente:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyProject.Models; 

namespace MyProject.Controllers 
{ 
    public class SeedController : Controller 
    { 
     public string Index() 
     { 
      ContactDBContext db = new Models.ContactDBContext(); 

      Person person = new Person(); 
      person.FullName = "Mr Test"; 
      person.Notes = "It's me!"; 
      db.People.Add(person); 
      db.SaveChanges(); 
      return "Seeding complete."; 
     } 
    } 
} 

Luego, después de ha recreado su base de datos desde el diagrama de Entidad Modelo simplemente navegue a la URL "/ Seed" de su sitio web y se volverá a llenar con sus datos iniciales.

+0

¿A los videntes les importa comentar? – Caltor

Cuestiones relacionadas