Как засевать данные при использовании подхода Model First?
Итак, я изучаю MVC3 и EF4.
Я попробовал первый метод кода, но для меня это было слишком запутанным. Я могу создавать классы без проблем, но сложная часть возникает при работе с внешними ключами и отношениями между собой.
Но сначала я пошел с моделью. Таким образом, я могу визуально спроектировать его и посмотреть, где находятся отношения.
После создания моей модели он создает SQL для меня, который я выполняю в своей базе данных SQL Express. Сделано и сделано.
Теперь я хочу данные в своих таблицах. Конечно, я могу просто добавить их в использование проводника сервера, но, скорее всего, я буду вносить изменения в свою модель, когда я иду. И продолжайте обновлять базу данных. Поэтому я не могу вручную вводить данные. Я знаю, если вы сначала используете код, вы можете получить DropCreateDatabaseIfModelChanges
и переопределить метод seed
.
Однако как это сделать с помощью первого подхода модели?
У меня есть следующий код:
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"},
};
}
}
Конечно, и в моем глобальном файле:
protected void Application_Start()
{
Database.SetInitializer<BettingContext>(new DatabaseInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
так что теперь? Как мне сказать, чтобы запустить метод? Что я делаю неправильно?
Ответы
Ответ 1
У вас может быть что-то вроде этого:
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
{
}
Затем в Application_Start()
вы вызываете:
Database.SetInitializer(new MySeedData());
В вашем случае вы можете попробовать создать DbSets (используя первые классы модели) вручную и попытаться подключить его, используя приведенный выше код. Это своего рода сочетание модели First + Code First.
public class FourthCoffeeWebContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
Добавление к этому: CreateDatabaseIfNotExists < (Of < (< 'TContext > ) > ) >
Ответ 2
Модель сначала существенно отличается от кода First, поскольку вы фактически генерируете базу данных из модели, когда работаете над ней. Вы получаете SQL, чтобы создать базу данных и запустить ее вручную, поэтому я счел логичным сохранить рядом с этим второй SQL script с моими исходными данными.
Если я вношу изменения в модель, обновляется SQL script, и я, конечно же, должен рассмотреть мой семенной SQL script (который удобно расположен рядом с моим созданием базы данных script). Я просто запускаю 1 после другого.
Этот подход работает до сих пор и не создает путаницы: "Где этот загрузчик данных и как он идентифицирует пустую базу данных". (Я могу также включить оба этих сценария SQL в мой проект установки для моего пользовательского действия для создания базы данных с данными семени.)
Ответ 3
Я использую Seeding Controller, подобный следующему:
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 me!";
db.People.Add(person);
db.SaveChanges();
return "Seeding complete.";
}
}
}
Затем, после того как вы восстановили свою базу данных из диаграммы Model Entity, просто перейдите к URL-адресу "/Seed" вашего веб-сайта, и он будет заселен вашими данными семени.