Подтвердить что ты не робот

Как засевать данные при использовании подхода 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);
}

так что теперь? Как мне сказать, чтобы запустить метод? Что я делаю неправильно?

4b9b3361

Ответ 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" вашего веб-сайта, и он будет заселен вашими данными семени.