Как заполнять данные при использовании подхода Model First? - PullRequest
20 голосов
/ 15 мая 2011

Итак, я изучаю 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);
}

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

Ответы [ 3 ]

13 голосов
/ 11 мая 2012

Модель First значительно отличается от Code First, поскольку вы фактически генерируете базу данных из модели, работая над ней.Вы получаете SQL для создания базы данных и запускаете его вручную, поэтому я считаю логичным сохранить рядом с этим 2-й скрипт SQL с моими начальными данными.

Если я внесу изменения в модель, скрипт SQLобновлен, и мне, конечно, нужно просмотреть исходный SQL-скрипт (который удобно расположен рядом со сценарием создания базы данных). Я просто запускаю 1 за другим.

Этот подход до сих пор работал нормально и не создает путаницы в том, «где находится этот загрузчик данных и как он идентифицирует пустую базу данных».(Я также могу включить оба этих сценария SQL в свой проект установки для своего настраиваемого действия по созданию базы данных с начальными данными.)

6 голосов
/ 15 мая 2011

У вас может быть что-то вроде этого:

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 (используя вашу модельПервые классы) вручную и попробуйте подключить его с помощью кода выше.Это своего рода сочетание Model First + Code First.

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

Добавление к этому: CreateDatabaseIfNotExists <(Of <(<'TContext>)>)>

0 голосов
/ 13 августа 2016

Я использую 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's me!";
            db.People.Add(person);
            db.SaveChanges();
            return "Seeding complete.";
        }
    }
}

Затем, после того как вы воссоздаете свою базу данных из диаграммы Model Entity, просто перейдите к URL-адресу "/ Seed" вашего сайта, и он снова будет заполненс вашими начальными данными.

...