.net - tipos - ventajas y desventajas del almacenamiento en la nube
¿Cómo sembrar datos cuando se utiliza el enfoque de Model First? (3)
El primer modelo es significativamente diferente del Código Primero, ya que en realidad genera la base de datos a partir del modelo mientras trabaja en él. Obtiene el SQL para crear la base de datos y ejecutarlo manualmente, por lo tanto, me pareció lógico mantener junto a este un segundo script SQL con mis datos semilla.
Si realizo cambios en el modelo, el script SQL se actualiza y, por supuesto, necesito revisar mi script SQL inicial (que está convenientemente ubicado al lado de mi script de creación de la base de datos). Solo ejecuto 1 después del otro.
Este enfoque ha funcionado bien hasta ahora 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 estas dos secuencias de comandos SQL en mi proyecto de instalación para mi acción personalizada para crear la base de datos con datos semilla).
Así que estoy aprendiendo MVC3 y EF4. Primero probé el método del código, pero fue demasiado confuso para mí ... Puedo crear las clases sin problemas, pero la parte difícil viene cuando se trata de claves externas y las relaciones entre ellas.
Pero he ido con el modelo primero. De esta manera puedo diseñarlo visualmente y ver dónde están las relaciones.
Después de crear mi modelo, crea un SQL para mí 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 del servidor, pero lo más probable es que esté haciendo cambios en mi modelo a medida que avanzo. Y sigue actualizando la base de datos. Así que no puedo seguir ingresando datos manualmente. Sé que si usa el código primero, puede derivar DropCreateDatabaseIfModelChanges
y anular el método de DropCreateDatabaseIfModelChanges
.
Sin embargo, ¿cómo hago esto con el primer enfoque del modelo? 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 que? ¿Cómo le digo que ejecute el método? ¿Qué estoy haciendo mal?
Puedes 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
{
}
Luego, dentro de Application_Start()
llamas:
Database.SetInitializer(new MySeedData());
En su caso, podría intentar crear DbSets (usando las primeras clases de su modelo) manualmente e intentar conectarlo con el código anterior. 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>)>)>
Yo uso 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, una vez que haya recreado su base de datos a partir del diagrama de la Entidad Modelo, simplemente navegue hasta la URL "/ Seed" de su sitio web y se volverá a llenar con sus datos semilla.