-
Notifications
You must be signed in to change notification settings - Fork 25.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Suggestion to use EF 2.1 Seed feature on MvcMovieContext instead #9205
Comments
@divega what's the best practice to seed the DB from an ASP.NET Core app? |
In order to update the Create an MVC web app tutorial to use EF 2.1 Seed feature in the MvcMovieContext instead of a separate SeedData class, some updates in the tutorial's code should be made. Instructions in the Work with SQL Server LocalDB and Add a new field sections are also required to be updated. By using EF 2.1 Seed feature on MvcMovieContext class, the MvcMovieContext.cs would be: using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace MvcMovie.Models
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<MvcMovie.Models.Movie> Movie { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Movie>().HasData(
new Movie
{
ID = 1,
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
ID = 2,
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
ID = 3,
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
ID = 4,
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
}
}
} The Program.cs file would also change for its initial implementation: using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
using MvcMovie;
namespace MvcMovie
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
} It also requires a new Migration to be generated and applied in order to insert the seed data in the db. |
@dannevesdantas great idea. We'll take this approach in the next upgrade (soon). cc @tdykstra |
cool @Rick-Anderson! I'm glad to be able to help. |
@Rick-Anderson @scottaddie @tdykstra Since the scenario ...
Do we want to do this in sample apps/topics where migrations aren't in use? It adds a layer of tedious complexity to our normal ✨ Just Run It!™️ ✨ samples. |
@divega should we use |
@dannevesdantas thanks for your suggestion, it worked very well.
|
@Rick-Anderson sorry I missed it when you mentioned me before. I don't know/remember in detail how the tutorial uses the seed data. I think using model data seeding feature would be a good idea as long as:
|
You're right @shadinamrouti! "Id" fits the convention. I've also noticed that in the old MVC 6 getting started tutorial SSOX was used for deleting the database, so I think it looks a good option, as beginners could learn how to use SSOX also while following the tutorial. |
We've decided to keep the current approach for simplicity. |
EF Core 2.1 brings back seed support by overriding the OnModelCreating method of a database Context class, same way as the "old" EF does. So it’s not required anymore to create a separate Initialize class and call it on Program.cs as the current tutorial does, the MvcMovieContext is now able to seed data (the same way as the old MVC 5 tutorials does). Moreover, I personally believe it would reduce the amount of code necessary to reach the goal of seeding data and consequently will decrease the complexity to beginners. I believe Introducing EF 2.1 seed capability on the tutorial would also be didactic.
What about updating the "Seed the database" section to seed data through MvcMovieContext database context class by overriding the OnModelCreating method?
Thanks so much.
Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.
The text was updated successfully, but these errors were encountered: